Arn*_*psa 15 c# inheritance constructor
如何调用受保护的构造函数?
public class Foo{
public Foo(a lot of arguments){}
protected Foo(){}
}
var foo=???
Run Code Online (Sandbox Code Playgroud)
这显然未通过测试:
public class FooMock:Foo{}
var foo=new FooMock();
Assert(typeof(Foo), foo.GetType());
Run Code Online (Sandbox Code Playgroud)
Ser*_*-Tm 28
调用无参数保护/私有构造函数:
Foo foo = (Foo)Activator.CreateInstance(typeof(Foo), true);
Run Code Online (Sandbox Code Playgroud)
使用参数调用非公共构造函数:
var foo = (Foo)typeof(Foo)
.GetConstructor(
BindingFlags.NonPublic | BindingFlags.CreateInstance | BindingFlags.Instance,
null,
new[] { typeof(double) },
null
)
.Invoke(new object[] { 1.0 });
class Foo
{
private Foo(double x){...}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 24
基本上,你只能从子类中调用它.你的FooMock类已经调用了受保护的构造函数,因为它等同于:
public class FooMock : Foo
{
public FooMock() : base() // Call the protected base constructor
{
}
}
Run Code Online (Sandbox Code Playgroud)
然而,你的断言将失败,因为对象的类型提及的是foo是FooMock,没有Foo.
表单的断言foo is Foo 将通过.
您不能通过Foo直接调用受保护的构造函数来构造实例.它被保护而不是公共的点是确保它只被子类调用(或者在Foo它自己的文本中).
您可以在完全信任环境中使用反射调用它,但我敦促您不要这样做.