我使用反射创建来自外部装配的对象。我的问题是我不能这样创建一个对象:
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);
答案 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);