没有无参数构造函数的类型的Activator.CreateInstance(Type)

Seb*_*Seb 15 .net c#

在工作中阅读现有代码,我想知道这怎么可行.我有一个在程序集中定义的类:

[Serializable]
public class A
{
    private readonly string _name;
    private A(string name)
    {
        _name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个集会中:

public void f(Type t) {
    object o = Activator.CreateInstance(t);
}
Run Code Online (Sandbox Code Playgroud)

那个简单的电话 f(typeof(A))

我期望缺少无参数构造函数的例外,因为AFAIK,如果声明了ctor,编译器不应该生成默认的公共无参数构造函数.

此代码在.NET 2.0下运行.

[编辑]我很抱歉,但我误读了实际的代码...我提供的示例没有说明它.我接受了JonH的答案,因为它提供了一个很好的信息.

Mar*_*ell 24

另一种选择是:

object obj = System.Runtime.Serialization.FormatterServices
          .GetUninitializedObject(t);
Run Code Online (Sandbox Code Playgroud)

它在内存中创建对象但运行任何构造函数.害怕.

  • 那*是非常可怕的,而且正是我所需要的!+1 (4认同)

Jon*_*onH 10

请参阅:使用反射在C#中创建没有默认构造函数的类型实例

这也是未来,这是关于C#4.0:

Microsoft于2010年1月4日下午2:08发布
我们已经审核了您的错误,并确定您描述的行为是设计的.我们现在正在归档此问题.感谢您使用Visual Studio和.Net Framework!

Activator.CreateInstance存在许多重载,采用单个类型参数的重载仅调用默认的无参数构造函数.采用可选参数(如示例中的参数)的构造函数不是默认构造函数.要调用它们,您需要:

  1. 使用带参数数组的重载
  2. 传入Type.Missing作为参数
  3. 在BindingFlags中指定OptionalParamBinding

这是一个例子:

Activator.CreateInstance(typeof(MyClassName),
 BindingFlags.CreateInstance |
 BindingFlags.Public |
 BindingFlags.Instance |
 BindingFlags.OptionalParamBinding,
 null, new Object[] {Type.Missing}, null);
Run Code Online (Sandbox Code Playgroud)

谢谢,

Weitao Su

微软公司