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