使用动态类型

时间:2009-05-15 15:56:22

标签: c# dynamic casting

我正在使用带有SQL DB的实体模型,我有一组约30个查找表,它们采用相同的3列格式, ID 文本,的 IsActive 即可。但是,我想创建一个表单而不是创建30个表单,并根据给定类型的字符串名称,然后填充gridview并允许插入更新删除该类型的记录。

我试过了

string objectType = "Namespace.Models.BenefitType";
object o = Assembly.GetExecutingAssembly().CreateInstance(objectType);
Type t = o.GetType();

但我无法访问该类型,我收到一条消息,说它是一种System.Type而不是BenefitType。

有人可以告诉我如何在动态调用之前构建一个未知的类型。

非常感谢

2 个答案:

答案 0 :(得分:1)

我肯定会使用接口,然后使用泛型类型(或通用方法),而不是真正动态地执行操作,如果可能的话。如果你自动生成的代码使用了部分类,那么这很容易做到 - 只需编写你当前所拥有的界面,然后添加一个新文件:

public partial class BenefitType : ICommonType {}
public partial class OtherType : ICommonType{} 
// etc

然后你可以写:

public class LookupForm<T> : Form where T : ICommonType, new()

你离开了。缺点是设计师对通用类型并不十分满意。

如果您只需要根据类型名称​​使用,您仍然可以这样做:

string objectType = "Namespace.Models.BenefitType";
Type type = Type.GetType(objectType);
Type formType = typeof(LookupForm<>).MakeGenericType(type);
Form form = (Form) Activator.CreateInstance(formType);

可能想要在LookupForm<T>Form之间创建一个抽象的非通用表单,您可以以强类型的方式使用它,但它没有任何内容做T。这取决于你需要做什么。

答案 1 :(得分:0)

目前您的选择有限。框架需要能够比编译时字符串名更多地了解类型信息,以便能够轻松使用它们。这意味着在类型字符串上执行类似switch语句的操作,这不是很好,或者确保所有动态类型都实现了一些可以强制转换的通用接口(更好)。

在C#4.0中,您将能够使用dynamic关键字在运行时解析这些调用。