在c#中调用类的受保护构造函数

时间:2012-05-30 16:47:39

标签: c# class constructor protected

  

可能重复:
  How to call protected constructor in c#?

我搜索了我的问题的解决方案 其实我不知道是否可能。请帮我。

namespace namespace1
{
    namespace namespace1a
    {
        public class classa
        {
            protected classa(string i) //protected constructor
            {
                //Do something
            }
            public classa() //public constructor
            {
                //Do something
            }

        }
    }

    namespace namespace1b
    {
        public class classb
        {
            classa i = new classa(); // calls public constructor of classa

            classa j = new classa("hi"); //Invalid. How to call the protected constructor of classa
        }
    }
}  

我想从“ classb ”中调用“ classa ”的受保护构造函数,该怎么做?请帮帮我。

5 个答案:

答案 0 :(得分:3)

如果

  • classaclassb属于同一个程序集
  • 您正在创作这两个课程
  • 您正在尝试保护classa的构造函数。

然后你可以将构造函数声明为protected internal

答案 1 :(得分:2)

您可以使用反射从类型的元数据中获取要调用的构造函数的引用:

var ctor = typeof(classa).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(string) }, null);

一旦你有了对构造函数的引用就可以调用它,传入你想要给构造函数作为对象数组的参数:

var instance = (classa)ctor.Invoke(new object[] { "Chicken butt" });

话虽如此,构造函数可能因某种原因受到保护,并且使用反射来绕过类型成员的封装通常不是一个好主意。

答案 2 :(得分:1)

执行此操作的一种安全方法是添加一个代理类,该代理类继承自classb,其公共构造函数采用字符串。受保护的合同定义明确。

class bproxy : classb
{
     public bproxy(string x) : base(x) {...}
}

另一种方法是使用反射。老实说我不建议这样做,因为当作者将构造函数设置为protected时,它只能由自身和派生类使用。您还与未明确定义的“合同”紧密相关。

话虽这么说,这个应该为你工作,虽然一旦作者改变合同的非保证部分就会中断(自行承担风险 ):

var constructor = typeof(classa).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
var b = constructor.First().Invoke(new object[] {"hi"});

答案 3 :(得分:0)

除非classb派生自classa,否则不可能。 Protected使构造函数仅对类本身和从classa派生的每个类都可见。

看看这里:Protected C#

答案 4 :(得分:0)

您的问题与this one重复。
除了从classa派生之外,反射是一个有用的选项(通过查询tpye的构造函数,然后运行合适的一个,如所提供的链接中的一个答案中所解释的那样)