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

C# 为什么在使用Activator.CreateInstance时需要定义无参数构造函数?,c#,.net,C#,.net,用这个的时候 Activator.CreateInstance() 在这个函数中 public static List<IType> GetTypeList() { List<IType> types = new List<IType>(); types.AddRange(from assembly in AppDomain.CurrentDomain.GetAssemblies()

用这个的时候

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;
    }
公共静态列表GetTypeList()
{
列表类型=新列表();
types.AddRange(来自AppDomain.CurrentDomain.GetAssemblys()中的程序集)
来自assembly.GetTypes()中的t
其中t.IsClass&&t.GetInterfaces()包含(typeof(IType))
选择Activator.CreateInstance(t)作为IType);
返回类型;
}
如果在实现IType的每个类中,如果我定义了一个接受参数但没有显式编写它所抱怨的默认构造函数的构造函数

未处理MissingMethodException “没有为此对象定义无参数构造函数。”

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

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

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

不是真的。如果显式定义任何构造函数,编译器将不再为您提供默认的无参数构造函数

但是请注意,您可以实例化一个没有无参数构造函数的类型。只需使用接受参数数组的。例如,如果构造函数接受两个
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上的和。

如果您希望能够在不调用构造函数的情况下创建对象(如反序列化时),我建议您执行CLR所做的操作并使用。尽管这满足了不需要对象具有无参数构造函数的要求,但如果不谨慎使用,可能会导致意外的副作用


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

+1。您还可以使用它将参数传递给构造函数@AlexeiLevenkov谢谢,我只是加了一句:)这真是个坏主意。OP几乎肯定不想这样做!提供选项,而不是对OP试图做的事情做出假设。正如我提到的,它可能会产生意想不到的副作用。给定代码示例,我看不出OP如何能够恰当地调用构造函数,可以吗?+1@TypeIA——我相信它是一种有效的方法,可以用于可能的用例和一般有趣的信息。虽然您可能是对的,OP不需要,但不清楚实际OP的目标是什么,如果是自定义序列化,那么这个解决方案可以很好地工作。MSDN文章中也有足够多的警告。是的,使用本文介绍的任何其他方法。在他发布的示例代码中,他正在创建新对象,而不是进行低级反序列化。有鉴于此,GetUninitializedObject()绝对、积极、客观地说不是一个有效的解决方案。很抱歉,你不同意,但我相信,根据OP的信息,你是自以为是的。我相信这正是人们所要求的。