.NET 3.5在运行时更改对象类型

时间:2016-08-10 09:59:59

标签: c#

在3.5中有一种简单的方法吗?我在.NET 4.0中发现了一种叫做“动态”的东西。

我有一类继承自CrestronControlSystem类的UI。在那里,我希望能够定义 一个未知类型的Panel,然后在方法中实例化。

我不想做拳击/取消装箱,因为

a)每个人都说这很糟糕

b)我必须在我定义和使用所有UI的ControlSystem中转换对象类型。在这一点上,我必须知道每个UI是为了投射它,我不希望这样。

so(XpanelForSmartGraphics)home.UIs [0] .UI_IPID,如果它是通过Boxing / Unboxing的XpanelForSmartGraphics的对象类型。

我在Generics上尝试了很多东西,但是无法按照我想要的方式工作,因为Generics不支持属性......

代码:

public class ControlSystem : CrestronControlSystem
{
        ..........
        public Home home = new Home("Home", 1, 1);                                                // this just defines my home object and takes number of rooms and number of UIs as a parameter
        .........
        home.UIs[0].DefineUI(0x03, "xpanel", "Study");                                               // here is where I want to say "this unknow object is now XpanelForSmartGraphics because string parameter = "xpanel"
        .........
        home.UIs[0].myPanel.BooleanInput[1].BoolValue = true;                                   // here is how I want to use it, so no casting.
}

public class UI : CrestronControlSystem
{
        public ??????  myPanel;                                                                      // how would it be defined ?

        .......
        public void DefineUI(ushort id, string type, string location)
        {
            .........
            myPanel = ?????? ;                                                                       // how ? :)
            .........
        }
}

谢谢

修改

所以这就是我需要的东西,但我希望能够给会员打电话 XpanelForSmartGraphics“正常方式”的运营商。这还是 表现为对象:

public void DefineUI(ushort id, string type, string location)
{
    if (type == "xpanel")
    {
        Type panelType = typeof(XpanelForSmartGraphics);
        this.myPanel = Activator.CreateInstance(panelType);
    }
}

所以我不能这样从ControlSystem类调用它:

home.UIs[0].myPanel.BooleanInput[1].BoolValue = true;

其中BooleanInput [1] .BoolValue它只是XpanelForSmartGraphics的一个属性

由于

1 个答案:

答案 0 :(得分:0)

您可以使用Activator类创建动态实例。 Activator.CreateInstance方法需要创建实例的Type

Type可以通过硬编码方式提供:

if (type == "xpanel") { return typeof(MyXPanel); }

或者您可以通过Type.GetType方法提供动态类型。

你的衣服可以是这样的:

public class UI : CrestronControlSystem {
    public object myPanel;

    public void DefineUI(ushort id, string type, string location) {
        Type panelType = Type.GetType(type);
        this.myPanel = Activator.CreateInstance(panelType);
    }
}