使用反射在内部类中使用参数实例化构造函数

KP6*_*P65 51 c# reflection

我有类似的东西:

object[] parameter = new object[1];
parameter[0] = x;
object instantiatedType =
Activator.CreateInstance(typeToInstantiate, parameter);
Run Code Online (Sandbox Code Playgroud)

internal class xxx : ICompare<Type>
{
    private object[] x;

    # region Constructors

    internal xxx(object[] x)
    {
        this.x = x;
    }

    internal xxx()
    {
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

我得到:

抛出异常:System.MissingMethodException:找不到类型为"xxxx.xxx"的构造函数..

有任何想法吗?

Ani*_*Ani 89

问题是Activator.CreateInstance(Type, object[])不考虑非公共构造函数.

例外

MissingMethodException:找不到匹配的公共构造函数.

通过将构造函数更改为public可见性可以很容易地显示出来; 然后代码正常工作.

这是一个解决方法(已测试):

 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);
Run Code Online (Sandbox Code Playgroud)

如果您只需要无参数构造函数,那么它也可以工作:

//using the overload: public static object CreateInstance(Type type, bool nonPublic)
object instantiatedType = Activator.CreateInstance(typeToInstantiate, true)
Run Code Online (Sandbox Code Playgroud)

  • 我对此进行了测试,并认为值得一提的是,此方法仅适用于非公共构造函数.要使它与公共构造函数和非公共构造函数一起使用,请将`BindingFlags`更改为`BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance` (10认同)

Mar*_*ell 27

(测试成功)

object instantiatedType =
   Activator.CreateInstance(typeToInstantiate,
   System.Reflection.BindingFlags.NonPublic |
     System.Reflection.BindingFlags.Instance,
   null, new object[] {parameter}, null);
Run Code Online (Sandbox Code Playgroud)

这有两个问题:

  • new object[] {parameter}帮助它处理传递一个object[]带参数的方法的单个参数的params object[]问题
  • BindingFlags帮助解决非公共构造

(这两个null绑定器有关 ;默认绑定器行为适用于我们想要的)


Tim*_*son 5

你需要调用一个不同的重载Activator.CreateInstance,让你传递一个nonPublicBindingFlags参数。

我发现所有这些CreateInstance重载都很笨拙;我更喜欢做的是:

  1. 打电话typeToInstantiate.GetConstructor(),路过BindingFlags.NonPublic
  2. 调用ConstructorInfo.Invoke,将构造函数参数传递给它