c# - 使用反射创建对象时出现 MissingMethodException

标签 c# object reflection missingmethodexception

我正在使用反射来创建来自外部程序集的对象。我的问题是我无法以这种方式创建对象:

Type t = assembly.GetType("ExternalClass");
object obj = Activator.CreateInstance(t, new object[] { data, Type.Missing, Type.Missing });

我得到System.MissingMethodException:附加信息:未找到类型“ExternalClass”的构造函数。但是使用这种方式一切正常:

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

最佳答案

这是使用Activator构造构造函数的方式

(T)Activator.CreateInstance(typeof(T), 
    BindingFlags.CreateInstance |
    BindingFlags.Public |
    BindingFlags.Instance |
    BindingFlags.OptionalParamBinding, null, new object[] { data, Type.Missing, Type.Missing }, CultureInfo.CurrentCulture);

关于c# - 使用反射创建对象时出现 MissingMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48844569/

相关文章:

c# - "Parameter is not valid."使用保存位图时

c++ - "A = Obj()"和 "A = new Obj()"有什么区别

c++ - 如何让非全局对象在函数内进行交互?

java - Java 中的可变字符串

java - 如何使用反射确定字段类型是否为列表(或任何其他类型的集合)?

c# - 将 ListBox.SelectedObjectCollection 转换为 ListBox.ObjectCollection?

c# - 是否可以将 schematron 架构编译成 Biztalk 程序集

javascript - JS 函数不更新对象

json - golang无法解析反射创建的对象的json

C# 公共(public)对象列表