C# 在不修改原始类的情况下访问受类保护的字段
我使用的第三方库公开了一些类型(由方法返回) 这种类型有一些我感兴趣的受保护字段,但是我无法使用它们,因为它们的可见性受保护 以下是问题的简化:C# 在不修改原始类的情况下访问受类保护的字段,c#,.net,oop,C#,.net,Oop,我使用的第三方库公开了一些类型(由方法返回) 这种类型有一些我感兴趣的受保护字段,但是我无法使用它们,因为它们的可见性受保护 以下是问题的简化: public class A { protected object Something; public A Load() { return new A(); } } public class ExtendedA : A {
public class A
{
protected object Something;
public A Load()
{
return new A();
}
}
public class ExtendedA : A
{
public void DoSomething()
{
// Get an instance.
var a = Load();
// Access protected fields (doesn't compile).
a.Something = ....
}
}
有什么简单的方法可以做到这一点吗?说明
您可以使用this.Something
访问该字段,因为您的类派生自类A
如果要创建类a
的实例,而不是派生类,则只能使用反射访问字段
使用反射进行采样
更多信息
- 这是因为您实际上无法访问它。
除了
this
(或base
)之外,您不能在任何实例上调用受保护的方法。
仅仅因为您的代码恰好位于的子代中,并不意味着此规则会突然更改
Eric Lippert在他的博客中有一个很好的解释:
通过从继承,您可以创建一个新类(ExtendedA),该类包含一个成员,您可以从ExtendedA中访问该成员
public class ExtendedA : A
{
public void DoSomething()
{
// works fine
this.Something = ....
}
}
继承不会使您能够访问某个实例来更改某些内容
public class ExtendedA : A
{
public void DoSomething()
{
var a = new A();
// access level error
a.Something = ....
}
}
如果要使用Something值,可以在ExtendedA中使用,但只能在ExtendedA实例自己的Something副本上使用
hth,Alan.编译器的错误消息是什么?我不明白,字段是受保护的,但当您从该类派生时,仍然无法访问成员?在实例**上调用
.Something
与a
之间有很大区别;这就是为什么受保护的服务器不允许您访问。Eric Lippert有一系列关于“为什么我不能从派生类访问受保护的成员?”-搜索它们?问题是我需要访问特定实例上的字段,而不是“this”如果已知值的类型与代码出现的类的类型相同或派生自该类的类型,则可以对除this
或base
以外的值调用受保护的方法。例如,如果基类B具有受保护的方法M(),那么派生类D可以调用(新的D()).M()。@EricLippert:我再次发现自己在阅读我指向的一篇博客文章,以了解真正发生的事情。谢谢:)不客气。还要注意的是,这篇原创文章还衍生了六篇文章,探讨了这条规则的各个方面。看看他们有多少人。干杯!我读了你的博客已经有一段时间了,非常喜欢。我是一个狂热的读者,很显然,很遗憾,我的阅读还不够透彻:)
public class ExtendedA : A
{
public void DoSomething()
{
var a = new A();
// access level error
a.Something = ....
}
}