创建具有反射

时间:2018-02-17 18:30:18

标签: c# object reflection missingmethodexception

我使用反射创建来自外部装配的对象。我的问题是我不能这样创建一个对象:

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);

2 个答案:

答案 0 :(得分:1)

这是使用Activator

构造构造函数的方法
(T)Activator.CreateInstance(typeof(T), 
    BindingFlags.CreateInstance |
    BindingFlags.Public |
    BindingFlags.Instance |
    BindingFlags.OptionalParamBinding, null, new object[] { data, Type.Missing, Type.Missing }, CultureInfo.CurrentCulture);

答案 1 :(得分:0)

您可以通过添加相应的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);