C# 在具有反射的内部类中使用参数实例化构造函数
我有一些类似的想法:C# 在具有反射的内部类中使用参数实例化构造函数,c#,reflection,C#,Reflection,我有一些类似的想法: object[] parameter = new object[1]; parameter[0] = x; object instantiatedType = Activator.CreateInstance(typeToInstantiate, parameter); 及 内部类xxx:ICompare { 私有对象[]x; #区域构造函数 内部xxx(对象[]x) { 这个.x=x; } 内部xxx() { } ... } 我得到: 引发异常:System.Miss
object[] parameter = new object[1];
parameter[0] = x;
object instantiatedType =
Activator.CreateInstance(typeToInstantiate, parameter);
及
内部类xxx:ICompare
{
私有对象[]x;
#区域构造函数
内部xxx(对象[]x)
{
这个.x=x;
}
内部xxx()
{
}
...
}
我得到:
引发异常:System.MissingMethodException:找不到类型为“xxxx.xxx”的构造函数
有什么想法吗?换成
Activator.CreateInstance(typeToInstantiate,new object[] { parameter });
这是因为您的构造函数也期望对象数组和激活器已经拆分为单独的对象问题是不考虑非公共构造函数。
例外情况
MissingMethodException:不匹配
找到了公共构造函数
将构造函数更改为public
visibility可以很容易地显示这一点;然后代码就可以正常工作了
这里有一个解决方法(已测试):
如果您只需要无参数构造函数,这也可以:
//using the overload: public static object CreateInstance(Type type, bool nonPublic)
object instantiatedType = Activator.CreateInstance(typeToInstantiate, true)
您需要调用该函数,以便传递非公共
或BindingFlags
参数
我发现所有这些CreateInstance
重载都很笨拙;我更喜欢做的是:
typetoinstate.GetConstructor()
,传递BindingFlags.NonPublic
ConstructorInfo.Invoke
,将构造函数参数传递给它
帮助它处理将newobject[]{parameter}
作为采用object[]
参数的方法的单个参数传递的问题params object[]
帮助解析非公共构造函数BindingFlags
(两个
null
s与活页夹相关;默认活页夹行为符合我们的要求)I最初,尽管您打算将参数
作为x
传递。然而,我刚刚意识到这可能不是你的意思,看看其他答案,似乎我并不孤单。如果这是正确的,我建议将参数
重命名为参数
。或者更好的办法是,完全不用参数
:Activator.CreateInstance(typetoinstate,newobject[]{x})
。我对此进行了测试,认为值得一提的是,此方法仅适用于非公共构造函数。要使其同时适用于公共构造函数和非公共构造函数,请将BindingFlags
更改为BindingFlags.public | BindingFlags.NonPublic | BindingFlags.Instance
也不必使用对象,您可以这样使用它:YourType instancedType=(YourType)Activator.CreateInstance(typeof(YourType),true)
似乎“Activator.CreateInstance”无法确定接受不同类型的两个单参数构造函数之间的差异……这种运行Activator.CreateInstance()的方法确实使封装变得无关紧要。真不错!
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)
object instantiatedType =
Activator.CreateInstance(typeToInstantiate,
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance,
null, new object[] {parameter}, null);