我正在使用带有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。
有人可以告诉我如何在动态调用之前构建一个未知的类型。
非常感谢
答案 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
关键字在运行时解析这些调用。