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

时间:2010-12-29 12:46:07

标签: 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 ???
    }

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

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

日Thnx

JT

3 个答案:

答案 0 :(得分:6)

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

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

dynamic dynSender=(dynamic)sender;
dynSender.Text="A";

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

Control controlSender=(Control)sender;
controlSender.Text="A";

由于您已在广告代码中投放到Control,因此您知道您的对象来自您示例中的Control。由于Text属性在Control中声明,因此足以访问它。

答案 1 :(得分:0)

在事件处理程序中,您可以使用“is”检查类型:

if (sender is TextBox)
{
   var textBox = (TextBox)sender;
   textbox.Text = "hello";
}

答案 2 :(得分:0)

您需要使用访客模式。 例如: http://www.dofactory.com/Patterns/PatternVisitor.aspx#_self1