我有一个应用程序,我可以从数据库动态创建表单上的控件。 这很有效,但我的问题如下:
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
答案 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