我有一个包含实体集合的数据提供程序。我只希望能够通过数据提供者创建一个新实体。
即,要创建我需要使用的新记录:
Entity entity = Provider.AddNew();
enity.set_Properties... etc
我的问题是,如果我将实体设置为Internal,System.Activator无法创建它们的实例。我的每个数据提供程序都使用Base类,其中包含通过的实体的泛型类型。
所以目前我的AddNew()方法包含以下内容:
public T AddNew()
{
T added = Activator.CreateInstance<T>();
this.Collection.Add(added);
return added;
}
如果我可以在数据提供程序命名空间之外手动实例化一个新实体,那么显然不是世界末日,但考虑到没有办法保存它们似乎毫无意义,那么为什么要选择这样做?
编辑:忘记提及我的所有提供者,实体等都在同一名称空间中。
答案 0 :(得分:0)
不要使用依赖于公共构造函数的Activator。而是使用反射来查找无参数构造函数然后调用它。这些方面的东西:
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);