在 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"的受保护构造函数,该怎么做?请帮助我。
if
-
classa
和classb
位于同一程序集中 - 您正在创作两个类
- 您正在尝试保护
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 的构造函数,然后运行合适的构造函数,如提供的链接中的一个答案中所述)