以下是我的代码:
class Foo
{
public string Bar { get; private set; }
}
和
var prop = typeof(Foo).GetProperty("Bar");
if (prop != null)
{
// The property exists
var setter = prop.GetSetMethod(true);
if (setter != null)
{
// There's a setter
Console.WriteLine(setter.IsPublic);
}
}
是的,正如你可以想象的那样,这种方法非常正确。但是当有遗传时,情况就不同了:
class Foo
{
public string Bar { get; private set; }
}
class A : Foo
{
}
当然我更改了这一行:
var prop = typeof(Foo).GetProperty("Bar");
到
var prop = typeof(A).GetProperty("Bar");
然后,setter变为null,而控制台什么都不打印!
所以...为什么呢?
顺便说一句,是否有一些解决方法可以实现这一目标或完全采用另一种方式?任何帮助将不胜感激。感谢。
答案 0 :(得分:3)
一般解决方案是致电
var prop = GetType().GetProperty("Bar").DeclaringType.GetProperty("Bar");
这不是很直观,我同意。
答案 1 :(得分:2)
所以...为什么?
就A
而言,Bar
是只读的 - 你不能从A
调用setter,所以当你提问时没有setter是有道理的对于A
。
另一种方法是使用绑定标志只询问声明的属性 - 然后沿着继承链向上走,直到找到实际的属性声明。你必须这样做有点奇怪,但它确实有一定的意义,因为属性真的 是不同的,这取决于你是否从声明的上下文来到它是否上课。
我对此行为感到惊讶 - 但震惊了。
答案 2 :(得分:0)
您可以通过在属性信息中使用SetValue方法来设置具有反射的私有属性,即使您无法获得set方法。