使用反射创建对象时出现 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);