2010-11-02 89 views
38

我沿着这个线的东西:实例化一个带参数的构造函数中的一个内部类与反思

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() 
    { 
    } 

    ... 
} 

我也得到:

抛出异常:系统.MissingMethodException:未找到类型'xxxx.xxx'的构造函数。

任何想法?

+0

我原本以为''parameter'是你传递给'x'的东西。然而,我只是意识到这可能不是你的意思,看着其他答案,似乎我并不孤单。如果这是正确的,我建议将'parameter'重命名为'parameters'。或者更好的是,完全省略'parameter':Activator.CreateInstance(typeToInstantiate,new object [] {x})'。 – 2010-11-02 11:55:33

回答

75

的问题是,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); 

如果你只需要参数的构造函数这也能发挥作用:

//using the overload: public static object CreateInstance(Type type, bool nonPublic) 
object instantiatedType = Activator.CreateInstance(typeToInstantiate, true) 
+0

大部分你的答案是有效的,谢谢。 – KP65 2010-11-02 12:27:59

+0

我应该收藏这个。 – 2013-09-20 20:41:10

+10

我测试了这个,认为值得一提的是这种方法只适用于非公共的构造函数。为了使它与公共和非公共构造函数一起工作,将'BindingFlags'改为'BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance' – ken 2014-06-19 19:53:18

1

将其更改为

Activator.CreateInstance(typeToInstantiate,new object[] { parameter }); 

这是因为你的构造也期望一个对象数组,并激活已经将其分解成独立的对象

3

你需要调用a different overload of Activator.CreateInstance,让你传递一个nonPublicBindingFlags参数。

我觉得所有这些CreateInstance重载笨拙;我更喜欢做的是:

  1. 呼叫typeToInstantiate.GetConstructor(),通过BindingFlags.NonPublic
  2. 呼叫ConstructorInfo.Invoke,传递给它的构造函数的参数
18

(测试成功)

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 S的问题涉及活页夹;默认的粘合行为对于我们想要的是没问题的)

相关问题