当前位置:  开发笔记 > 编程语言 > 正文

Activator.CreateInstance与私人密封类

如何解决《Activator.CreateInstance与私人密封类》经验,为你挑选了3个好方法。

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



1> Jon Skeet..:

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


文档说CreateInstance只在2.0sp1之前调用公共构造函数.在那之后,有一堆必要的权限.

2> Andrew Hare..:

我让它以这种方式工作:

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.去搞清楚.



3> 小智..:

我可能在响应方面有点迟,但我遇到了一个类似的问题,适合这个主题.我想使用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"的构造函数.请享用

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有