使用反射创建对象时出现 MissingMethodException
MissingMethodException when creating an object with reflection
我正在使用反射创建来自外部程序集的对象。我的问题是我无法以这种方式创建对象:
Type t = assembly.GetType("ExternalClass");
object obj = Activator.CreateInstance(t, new object[] { data, Type.Missing, Type.Missing });
我得到 System.MissingMethodException:Additional information: Constructor on type 'ExternalClass' not found.
但是使用这种方式一切正常:
Type t = assembly.GetType("ExternalClass");
ConstructorInfo[] constructors = t.GetConstructors();
object obj = constructors[0].Invoke(new object[] { data, Type.Missing, Type.Missing });
ExternalClass
只有 1 个构造函数和 2 个可选参数,我确定我传递的参数是正确的,因为第二种方法创建了我想要的对象。我在第一种方法中错过了什么吗?我更喜欢第一个,因为它更容易阅读
编辑:
我忘记了 CultureInfo
(为什么这个方法需要它?!)。解决方案是使用:
object obj = Activator.CreateInstance(t,
BindingFlags.CreateInstance |
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.OptionalParamBinding, null, new object[] { data, Type.Missing, Type.Missing }, CultureInfo.CurrentCulture);
您可以通过添加适当的 binding flags 来实现,例如:
(T)Activator.CreateInstance(typeof(T),
BindingFlags.CreateInstance |
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.OptionalParamBinding,
null,
new object[] {data, Type.Missing, Type.Missing },
CultureInfo.CurrentCulture);
这是您应该如何使用 Activator
构造构造函数的方式
(T)Activator.CreateInstance(typeof(T),
BindingFlags.CreateInstance |
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.OptionalParamBinding, null, new object[] { data, Type.Missing, Type.Missing }, CultureInfo.CurrentCulture);
我正在使用反射创建来自外部程序集的对象。我的问题是我无法以这种方式创建对象:
Type t = assembly.GetType("ExternalClass");
object obj = Activator.CreateInstance(t, new object[] { data, Type.Missing, Type.Missing });
我得到 System.MissingMethodException:Additional information: Constructor on type 'ExternalClass' not found.
但是使用这种方式一切正常:
Type t = assembly.GetType("ExternalClass");
ConstructorInfo[] constructors = t.GetConstructors();
object obj = constructors[0].Invoke(new object[] { data, Type.Missing, Type.Missing });
ExternalClass
只有 1 个构造函数和 2 个可选参数,我确定我传递的参数是正确的,因为第二种方法创建了我想要的对象。我在第一种方法中错过了什么吗?我更喜欢第一个,因为它更容易阅读
编辑:
我忘记了 CultureInfo
(为什么这个方法需要它?!)。解决方案是使用:
object obj = Activator.CreateInstance(t,
BindingFlags.CreateInstance |
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.OptionalParamBinding, null, new object[] { data, Type.Missing, Type.Missing }, CultureInfo.CurrentCulture);
您可以通过添加适当的 binding flags 来实现,例如:
(T)Activator.CreateInstance(typeof(T),
BindingFlags.CreateInstance |
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.OptionalParamBinding,
null,
new object[] {data, Type.Missing, Type.Missing },
CultureInfo.CurrentCulture);
这是您应该如何使用 Activator
(T)Activator.CreateInstance(typeof(T),
BindingFlags.CreateInstance |
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.OptionalParamBinding, null, new object[] { data, Type.Missing, Type.Missing }, CultureInfo.CurrentCulture);