在运行时动态转换控件类型

Jay*_*ayT 2 c#

我有一个应用程序,我从数据库动态创建窗体上的控件.这很好用,但我的问题如下:

    private Type activeControlType;        

    private void addControl(ContainerControl inputControl, string ControlName, string Namespace,
        string ControlDisplayText, DataRow drow, string cntrlName)
    {
        Assembly assem;
        Type myType = Type.GetType(ControlName + ", " + Namespace);
        assem = Assembly.GetAssembly(myType);

        Type controlType = assem.GetType(ControlName);
        object obj = Activator.CreateInstance(controlType);
        Control tb = (Control)obj;
        tb.Click += new EventHandler(Cntrl_Click);
        inputControl.Controls.Add(tb);
        activeControlType = controlType;
    }

    private void Cntrl_Click(object sender, EventArgs e)
    {
         string test = ((activeControlType)sender).Text;  //Problem ???
    }
Run Code Online (Sandbox Code Playgroud)

如何动态地将发送方对象转换为可以引用其属性字段的类.

我用谷歌搜索,发现自己正在尝试我遇到的一切.....现在我非常困惑......需要一些帮助

日Thnx

JT

Cod*_*aos 6

您只能转换为编译时已知的类型.因此,您需要使用已经可以强制转换的已知基类或接口,或者需要使用反射.在C#4中,基于反射的方法比早期版本更容易,因为它引入了dynamic关键字.在可能的情况下,我更喜欢静态类型的方法.

在C#4中,您可以使用dynamic:

dynamic dynSender=(dynamic)sender;
dynSender.Text="A";
Run Code Online (Sandbox Code Playgroud)

或者,如果您知道它来自Control:

Control controlSender=(Control)sender;
controlSender.Text="A";
Run Code Online (Sandbox Code Playgroud)

由于您已经Control在您的创建代码中进行了转换,因此您知道您的对象来自Control您的示例.而且由于Text声明属性Control足以访问它.