Activator.CreateInstance与私人密封类

我正在尝试新建一个LocalCommand实例,它是System.Data.SqlClient.SqlCommandSet的私有类。 我似乎能够很好地获取类型信息:

Assembly sysData = Assembly.Load("System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); localCmdType = sysData.GetType("System.Data.SqlClient.SqlCommandSet+LocalCommand"); 

但是当我尝试实例化它时,Activator.CreateInstance会抛出exception:

 object item = Activator.CreateInstance(localCmdType, new object[] { commandText, parameters, num7, commandType }); 

System.MissingMethodException:找不到类型为“System.Data.SqlClient.SqlCommandSet + LocalCommand”的构造函数。

构造函数参数匹配我在Reflector中看到的签名。 是新的私有类,内部ctor支持不同的CreateInstance重载或什么?

我的第一个想法是使用ConstructorInfo constructorInfo = Type.GetConstructor()获取ConstructorInfo ,然后使用constructorInfo.Invoke() 。 我怀疑Activator.CreateInstance很难调用你通常无法访问的构造函数,尽管我不记得自己尝试了。

我让它以这种方式工作:

 using System; using System.Reflection; class Test { public String X { get; set; } Test(String x) { this.X = x; } } class Program { static void Main() { Type type = typeof(Test); ConstructorInfo c = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(String) }, null); Object o = c.Invoke(new Object[] { "foo" }); } } 

诀窍是专门使用GetConstructor来修改构造函数,而不是试图在GetConstructors的结果中找到它。 去搞清楚。

我可能在回复方面有点迟,但我遇到了一个类似的问题,适合这个主题。 我想使用Activator.CreateInstance实例化一个非公共构造函数并传递它的参数。

  public class Node { string name; Node parent; protected Node(string name,Node parent) { this.name = name; this.parent = parent; } public static Node Create(string name,Node parent) { Node result = Activator.CreateInstance(typeof(Node),BindingFlags.Instance | BindingFlags.NonPublic,null, new object[] { name, parent }, null) as Node; return result; } 

棘手的部分是绑定标志。 我的第一直觉是使用BindingFlags.CreateInstance | BindingFlags.NonPublic,但是会引发exception:MissingMethodException找不到类型为“Node”的构造函数。 请享用

诀窍是确保使用正确的CreateInstance重载:

 // WRONG ... Activator.CreateInstance( type, BindingFlags.Instance | BindingFlags.NonPublic ); 

这会调用params重载,默认为Instance | Public | CreateInstance Instance | Public | CreateInstance Instance | Public | CreateInstance ,你的绑定标志将作为参数传递给构造函数,给出模糊的MissingMethodException

另外,使用Instance | Public | NonPublic Instance | Public | NonPublic Instance | Public | NonPublic如果您不确定构造函数的可见性:

 // right ... Activator.CreateInstance( type, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new object[] { }, // or your actual constructor arguments null );