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

本文关键字:受保护 构造函数 调用 | 更新日期: 2023-09-27 18:36:00

可能的重复项:
如何在 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"的受保护构造函数,该怎么做?请帮助我。

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

if

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

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

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

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

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

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

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

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

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

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

话虽如此,这应该对您有用,尽管一旦作者更改合同的非保证部分,它就会中断(使用风险

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

除非 class b 派生自 classa,否则这是不可能的。受保护使构造函数仅对类本身和派生自 classa 的每个类可见。

查看此处: 受保护的 C#

你的问题是这个问题的重复。
除了从 classa 派生之外,反射是一个有用的选项(通过查询 TPYE 的构造函数,然后运行合适的构造函数,如提供的链接中的一个答案中所述)