在工作中阅读现有代码,我想知道这怎么可行.我有一个在程序集中定义的类:
[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)
它在内存中创建对象但不运行任何构造函数.害怕.
Jon*_*onH 10
这也是未来,这是关于C#4.0:
Microsoft于2010年1月4日下午2:08发布
我们已经审核了您的错误,并确定您描述的行为是设计的.我们现在正在归档此问题.感谢您使用Visual Studio和.Net Framework!Activator.CreateInstance存在许多重载,采用单个类型参数的重载仅调用默认的无参数构造函数.采用可选参数(如示例中的参数)的构造函数不是默认构造函数.要调用它们,您需要:
- 使用带参数数组的重载
- 传入Type.Missing作为参数
- 在BindingFlags中指定OptionalParamBinding
这是一个例子:
Run Code Online (Sandbox Code Playgroud)Activator.CreateInstance(typeof(MyClassName), BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.Instance | BindingFlags.OptionalParamBinding, null, new Object[] {Type.Missing}, null);谢谢,
Weitao Su
微软公司