为什么在使用Activator.CreateInstance时需要定义无参数构造函数?

时间:2014-03-28 20:16:23

标签: c# .net

使用此时

Activator.CreateInstance()

在这个函数中

    public static List<IType> GetTypeList()
    {
        List<IType> types = new List<IType>();
        types.AddRange(from assembly in AppDomain.CurrentDomain.GetAssemblies()
                       from t in assembly.GetTypes()
                       where t.IsClass && t.GetInterfaces().Contains(typeof(IType))
                       select Activator.CreateInstance(t) as IType);

        return types;
    }

如果在我的每个类中都实现了IType,如果我定义了一个带参数的构造函数但是没有明确地写出它所抱怨的默认构造函数

MissingMethodException未处理 &#34;没有为此对象定义无参数构造函数。&#34;

但是当我删除所有构造函数时,它工作正常,没有错误,即使我也没有显式编写默认构造函数。

我认为默认的无参数构造函数总是在那里,即使你没有定义它

2 个答案:

答案 0 :(得分:7)

  

我认为默认的无参数构造函数总是在那里,即使你没有定义它

不正确。如果您明确定义任何构造函数,编译器将不再为您提供默认的无参数构造函数。

但请注意,可以实例化一个没有无参数构造函数的类型。只需使用带有一系列参数的Activator.CreateInstance() overload即可。例如,如果构造函数需要两个int s,并传递值42和123:

MyClass obj = (MyClass) Activator.CreateInstance(typeof(MyClass), 42, 123);

您也可以直接使用反射API:

var type = typeof(MyClass);
var ctor = type.GetConstructor(new Type[] { typeof(int), typeof(int) });
MyClass obj = (MyClass) ctor.Invoke(new object[] { 42, 123 });

在MSDN上查看Type.GetConstructor()ConstructorInfo.Invoke()

答案 1 :(得分:0)

如果您希望能够在不调用构造函数的情况下创建对象(比如反序列化时),我建议您使用FormatterServices.GetUnitializedObject执行CLR所做的工作。虽然这满足了不需要对象具有无框架构造函数的要求,但如果不经常使用它可能会导致意外的副作用。

否则,您需要使用无参数构造函数和/或修改代码来处理参数。