我正在使用一些暴露某种类型的第三方库(由方法返回)。
此类型有一些我感兴趣的受保护字段,但我无法使用它们,因为它们的可见性受保护。
以下是问题的简化:
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 = ....
}
}
有没有简单的方法来实现这个目标?
答案 0 :(得分:5)
您可以使用this.Something
访问该字段,因为您的课程源自class A
。
如果要创建class A
的实例,而不是派生类,则只能使用反射访问该字段。
public class ExtendedA : A
{
public void DoSomething()
{
// Get an instance.
var a = Load();
//get the type of the class
Type type = a.GetType();
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
// get the field info
FieldInfo finfo = type.GetField("Something", bindingFlags);
// set the value
finfo.SetValue(a, "Hello World!");
// get the value
object someThingField = finfo.GetValue(a);
}
}
答案 1 :(得分:2)
那是因为你实际上无法访问它。
您无法在this
(或base
)以外的任何实例上调用受保护的方法。
仅仅因为您的代码恰好位于A的后代并不意味着此规则突然发生变化。
Eric Lippert在他的博客中有一个很好的解释: http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/why-can-t-i-access-a-protected-member-from-a-derived-class.aspx
答案 2 :(得分:0)
通过从A继承,您可以创建一个新类(ExtendedA),其中包含可以从ExtendedA中访问的成员 Something
public class ExtendedA : A
{
public void DoSomething()
{
// works fine
this.Something = ....
}
}
继承不会让您能够进入A的实例来改变某事
public class ExtendedA : A
{
public void DoSomething()
{
var a = new A();
// access level error
a.Something = ....
}
}
如果您想使用 Something 值,您可以在ExtendedA中执行此操作,但仅限于ExtendedA实例自己的 Something 副本。
hth,
艾伦。