我有一个包含实体的集合的数据提供者。我只希望能够通过数据提供程序创建一个新的实体。

即,以创建新的记录我需要使用:

Entity entity = Provider.AddNew();
enity.set_Properties... etc

我的问题是,如果我把我的实体内部,System.Activator不能创建它们的实例。我的每一个数据提供者的使用基类与通过的一般类型的实体。

因此,在此刻我的的AddNew()方法包含以下内容:

public T AddNew()
{
  T added = Activator.CreateInstance<T>();
  this.Collection.Add(added);
  return added;
}

这显然不是世界的末日,如果我可以手动实例化一个新的实体数据提供者的名称空间之外,但似乎毫无意义的考虑有没有办法永远保存它们,那么为什么要给这样做的选项?

编辑:忘了提,我所有的供应商,实体等都是在同一个命名空间

有帮助吗?

解决方案

不要使用激活,它依赖于公共构造函数。相反,使用反射来找到参数的构造函数,然后调用它。沿着这些线的东西:

Type t = typeof(MyType);
var parameterlessCtor = (from c in t.GetConstructors(
  BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
    where c.GetParameters().Length == 0
    select c).FirstOrDefault;
if(parameterlessCtor != null) instance = parameterlessCtor.Invoke(null);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top