C# CF2.0 - System.Activator 和内部类

Posted

技术标签:

【中文标题】C# CF2.0 - System.Activator 和内部类【英文标题】:C# CF2.0 - System.Activator and Internal classes 【发布时间】:2009-05-20 10:07:05 【问题描述】:

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

即创建一条我需要使用的新记录:

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;

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

编辑:忘了说我所有的提供者、实体等都在同一个命名空间中。

【问题讨论】:

【参考方案1】:

不要使用依赖于公共构造函数的 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);

【讨论】:

以上是关于C# CF2.0 - System.Activator 和内部类的主要内容,如果未能解决你的问题,请参考以下文章

查看控制器转换错误

C#入门系列——第一个C#程序

译《C# 小技巧 -- 编写更优雅的 C#》原书名《C# Tips -- Write Better C#》

C#进阶C# 泛型

C#进阶C# 匿名方法

C#进阶C# 多线程