使用分配的某种类型的变量进行强制转换

本文关键字:变量 转换 类型 分配 种类 | 更新日期: 2023-09-27 18:30:48

我想做的是做需要将我的控件添加到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);

使用分配的某种类型的变量进行强制转换

错误是因为强制转换表达式的类型部分必须是类型(或类型参数)的名称 - 而不是表达式的值。

你为什么觉得你需要选角?为什么不只是:

panel.Items.Add(new Ext.Net.NumericField());

你为什么要Control演员阵容?NumericField不是已经从Control派生出来的吗?你为什么使用typeof?基本上,我看不出您提供的代码中需要任何强制转换。如果您认为它们有充分的理由,请为问题添加更多上下文。

通过一些重构,您应该能够在不使用太多强制转换的情况下构建相同的结果。下面的示例演示了一种非常简化的方法。

<%@ 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>