我搜索了我的问题的解决方案 其实我不知道是否可能。请帮我。
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 ”的受保护构造函数,该怎么做?请帮帮我。
答案 0 :(得分:3)
如果
classa
和classb
属于同一个程序集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的构造函数,然后运行合适的一个,如所提供的链接中的一个答案中所解释的那样)