使用reflection在内部类中使用参数实例化构造函数
我有这样的一些东西:
object[] parameter = new object[1]; parameter[0] = x; object instantiatedType = Activator.CreateInstance(typeToInstantiate, parameter);
和
internal class xxx : ICompare<Type> { private object[] x; # region Constructors internal xxx(object[] x) { this.x = x; } internal xxx() { } ... }
我得到:
抛出exception:System.MissingMethodException:未findtypes为“xxxx.xxx”的构造函数
有任何想法吗?
问题是Activator.CreateInstance(Type, object[])
不考虑非公共构造函数。
例外
MissingMethodException:找不到匹配的公共构造函数。
通过将构造函数更改为public
可见性可以很容易地看出这一点 该代码然后正常工作。
这是一个解决方法(testing):
BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance; CultureInfo culture = null; // use InvariantCulture or other if you prefer object instantiatedType = Activator.CreateInstance(typeToInstantiate, flags, null, parameter, culture);
如果你只需要无参数的构造函数,那么它也可以工作:
//using the overload: public static object CreateInstance(Type type, bool nonPublic) object instantiatedType = Activator.CreateInstance(typeToInstantiate, true)
(testing成功)
object instantiatedType = Activator.CreateInstance(typeToInstantiate, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, new object[] {parameter}, null);
这个地址有两个问题:
-
new object[] {parameter}
可以帮助它处理传递一个object[]
作为一个单一的参数的方法,接受一个params object[]
参数 -
BindingFlags
有助于解决非公共的构造函数
(这两个null
与binder有关 ;默认的binder的行为对于我们想要的是很好的)
你需要调用一个不同的Activator.CreateInstance
重载,它允许你传递一个nonPublic
或BindingFlags
参数。
我发现所有这些CreateInstance
重载笨拙; 我更喜欢做的是:
- 调用
typeToInstantiate.GetConstructor()
,传递BindingFlags.NonPublic
- 调用
ConstructorInfo.Invoke
,传递构造函数参数
改变它
Activator.CreateInstance(typeToInstantiate,new object[] { parameter });
这是因为你的构造函数也期望一个对象数组和激活器已经把它分解成单独的对象