繁体   English   中英

带有私有密封类的 Activator.CreateInstance

[英]Activator.CreateInstance with private sealed class

我正在尝试新建一个 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 重载还是什么?

我的第一个想法是使用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(
         type: typeof(Node),
         bindingAttr: BindingFlags.Instance  | BindingFlags.NonPublic,
         binder: null, //default binder
         args: new object[] { name, parent },
         culture: null);
       return (Node)result;
    }
}

棘手的部分是绑定标志。

我的第一直觉是使用BindingFlags.CreateInstance | BindingFlags.NonPublic BindingFlags.CreateInstance | BindingFlags.NonPublic ,但是这导致抛出异常:未找到类型“节点”上的 MissingMethodException 构造函数。

技巧是确保使用正确的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
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM