Приведение с присвоенной переменной некоторого типа
То, что я пытаюсь сделать, это сделать бросок, необходимый, чтобы добавить свои элементы управления в Ext.Net.Panel
,
Это мой пример кода:
Ext.Net.Panel panel = new Ext.Net.Panel();
Control control = (Control) null;//here can be any Ext.Net type as well as NumeticField for example Ext.Net.TextArea and so on
switch (infoAttribute.Type)
{
case PropertyTypeAttrib.Text:
control = (Control)new Ext.Net.TextField();
((TextField)control).FieldLabel = infoAttribute.HeadLine;
control.ID = propertyHelper.Name;
//panel.Items.Add((TextField)control);
typeToCast = typeof (TextField);
break;
case PropertyTypeAttrib.FileUrl:
control = (Control) new Ext.Net.HyperLink();
control.ID = propertyHelper.Name;
((Ext.Net.Label) control).FieldLabel = infoAttribute.HeadLine;
//panel.Items.Add((Ext.Net.HyperLink) control);
typeToCast = typeof (Ext.Net.HyperLink);
break;
case PropertyTypeAttrib.Enum:
control = (Control) new MMPControls.Web.ComboBoxEnumExt();
((MMPControls.Web.ComboBoxEnumExt) control).EnumerationTypeName =
propertyHelper.PropertyType.Name;
control.ID = propertyHelper.Name;
((MMPControls.Web.ComboBoxEnumExt) control).FieldLabel = infoAttribute.HeadLine;
//panel.Items.Add((MMPControls.Web.ComboBoxEnumExt) control);
typeToCast = typeof (MMPControls.Web.ComboBoxEnumExt);
break;
case PropertyTypeAttrib.Date:
control = new MMPControls.Web.DateSelect();
control.ID = propertyHelper.Name;
//panel.Items.Add(
//(MMPControls.Web.DateSelect) control);
//panel.Items.Add((MMPControls.Web.DateSelect)control);
typeToCast = typeof (MMPControls.Web.DateSelect);
break;
case PropertyTypeAttrib.DateTime:
control = new MMPControls.Web.DateSelect();
control.ID = propertyHelper.Name;
//panel.Items.Add(
//(MMPControls.Web.DateSelect)control);
typeToCast = typeof (MMPControls.Web.DateSelect);
break;
case PropertyTypeAttrib.TextInteger:
control = (Control)new Ext.Net.NumberField();
((NumberField)control).AllowDecimals = false;
((NumberField)control).MinValue = 0;
((Ext.Net.NumberField)control).FieldLabel = infoAttribute.HeadLine;
control.ID = propertyHelper.Name;
//panel.Items.Add(
//(Ext.Net.NumberField) control);
typeToCast = typeof (Ext.Net.NumberField);
break;
case PropertyTypeAttrib.IList:
//TODO:
break;
case PropertyTypeAttrib.ImageUrl:
control = (Control)new Ext.Net.Image();
control.ID = propertyHelper.Name;
((Ext.Net.Image)control).FieldLabel = infoAttribute.HeadLine;
//panel.Items.Add((Ext.Net.Image) control);
typeToCast = typeof (Ext.Net.Image);
break;
case PropertyTypeAttrib.TextFractional:
control = (Control)new Ext.Net.NumberField();
((NumberField)control).AllowDecimals = true;
((NumberField)control).DecimalPrecision = infoAttribute.Fractional;
((NumberField)control).MinValue = 0;
((Ext.Net.NumberField)control).FieldLabel = infoAttribute.HeadLine;
control.ID = propertyHelper.Name;
//panel.Items.Add(
//(Ext.Net.NumberField) control);
typeToCast = typeof (Ext.Net.NumberField);
break;
case PropertyTypeAttrib.TextLarge:
control = (Control)new Ext.Net.TextArea();
((TextArea)control).FieldLabel = infoAttribute.HeadLine;
control.ID = propertyHelper.Name;
//panel.Items.Add((TextArea)control);
typeToCast = typeof (TextArea);
break;
}
panel.Items.Add((typeToCast)control);//that's what i need to do.
получил ошибку в строке panel.Items.....
не удается разрешить этот тип символа ToCast
Кто-нибудь делал что-то подобное раньше?
Спасибо за продвижение:)
Решено:
Я бросил свой готовый контроль Component
тип.panel.Items.Add((Component)control);
2 ответа
С небольшим рефакторингом вы сможете получить тот же результат без использования большого количества кастинга. Следующий пример демонстрирует очень упрощенный подход.
пример
<%@ Page Language="C#" %>
<%@ Import Namespace="Panel=Ext.Net.Panel" %>
<%@ Import Namespace="Button=Ext.Net.Button" %>
<%@ Register assembly="Ext.Net" namespace="Ext.Net" tagprefix="ext" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (!X.IsAjaxRequest)
{
this.Form.Controls.Add(this.BuildForm());
}
}
private Component BuildForm()
{
var panel = new FormPanel {
Title = "Example",
Width = 350,
Height = 215,
Padding = 5,
DefaultAnchor = "100%",
Buttons = { new Button { Text = "Submit" }}
};
panel.Items.Add(this.BuildWidget(new Widget {
Name = "text",
ID = "TextField1",
Label = "My TextField"
}));
panel.Items.Add(this.BuildWidget(new Widget {
Name = "date",
ID = "DateField1",
Label = "My DateField"
}));
return panel;
}
private Field BuildWidget(Widget widget)
{
Field field = null;
switch(widget.Name)
{
case "text":
field = new TextField();
break;
case "date":
field = new DateField();
break;
}
field.ID = widget.ID;
field.FieldLabel = widget.Label;
return field;
}
public class Widget
{
public string Name { get; set; }
public string ID { get; set; }
public string Label { get; set; }
}
</script>
<!DOCTYPE html>
<html>
<head runat="server">
<title>Ext.NET Example</title>
</head>
<body>
<form runat="server">
<ext:ResourceManager runat="server" />
</form>
</body>
</html>
Ну, ошибка в том, что часть типа выражения приведения должна быть именем типа (или параметром типа), а не значением выражения.
Почему вы чувствуете, что вам нужно сыграть на всех? Почему не просто
panel.Items.Add(new Ext.Net.NumericField());
Почему у вас есть актёрский состав Control
совсем? Есть ли NumericField
еще не получены из Control
? Почему вы используете typeof
? По сути, я не вижу необходимости в приведении кода в представленном вами коде. Если вы считаете, что для этого есть веская причина, добавьте больше контекста к вопросу.