gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:59:49 27 4
gpt4 key购买 nike

使用时

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“没有为此对象定义无参数构造函数。”

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

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

最佳答案

I thought that the default parameterless constructor was always there even if you didn't define it

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

不过请注意,您可以实例化一个没有无参数构造函数的类型。只需使用 Activator.CreateInstance() overload它需要一个参数数组。例如,如果构造函数采用两个 int,并传递值 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 });

参见 Type.GetConstructor()ConstructorInfo.Invoke()在 MSDN 上。

关于c# - 为什么使用 Activator.CreateInstance 时需要定义无参数构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22722405/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com