我正在尝试新建一个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会抛出异常:
object item = Activator.CreateInstance(localCmdType,
new object[] { commandText, parameters, num7, commandType });
System.MissingMethodException:找不到类型为“System.Data.SqlClient.SqlCommandSet + LocalCommand”的构造函数。
构造函数参数与我在Reflector中看到的签名相匹配。是不是新的私有类,内部ctor支持不同的CreateInstance重载或什么?
答案 0 :(得分:20)
我的第一个想法是使用ConstructorInfo
获取ConstructorInfo constructorInfo = Type.GetConstructor()
,然后使用constructorInfo.Invoke()
。我怀疑Activator.CreateInstance
很难调用你通常无法访问的构造函数,尽管我不记得自己尝试过了。
答案 1 :(得分:18)
我让它以这种方式工作:
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
的结果中找到它。去图。
答案 2 :(得分:10)
我的回复可能有点迟,但我遇到了一个类似的问题,适合这个话题。我想使用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,但是导致抛出异常:MissingMethodException找不到类型为“Node”的构造函数。享受
答案 3 :(得分:0)
诀窍是确保使用正确的CreateInstance
重载:
// WRONG
... Activator.CreateInstance(
type,
BindingFlags.Instance
| BindingFlags.NonPublic
);
这会调用params
重载,它将默认为Instance | Public | CreateInstance
,并且您的绑定标志将作为参数传递给构造函数,从而产生模糊的MissingMethodException
。
另外,如果您不确定构造函数的可见性,请使用Instance | Public | NonPublic
:
// right
... Activator.CreateInstance(
type,
BindingFlags.Instance
| BindingFlags.Public
| BindingFlags.NonPublic,
null,
new object[] { }, // or your actual constructor arguments
null
);