4

以下是我的代码:

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,控制台不打印任何内容!

所以为什么?

顺便说一句,是否有一些解决方法可以使这种情况发生或完全是另一种方法?

任何帮助,将不胜感激。谢谢。

4

3 回答 3

3

一般的解决方案是调用

var prop = GetType().GetProperty("Bar").DeclaringType.GetProperty("Bar");

这不是很直观,我同意。

于 2013-06-28T06:31:19.330 回答
2

所以为什么?

就. A_ Bar_ A_A

一种替代方法是使用绑定标志只请求声明的属性 - 并沿着继承链向上走,直到找到实际的属性声明。您必须这样做有点奇怪,但它确实具有一定的意义,因为属性确实不同,具体取决于您是否从声明类的上下文中获得它。

我对这种行为感到惊讶——但并不感到震惊

于 2013-06-28T05:45:16.523 回答
0

您可以通过仅使用属性信息中的 SetValue 方法来设置具有反射的私有属性,即使您无法获取 set 方法。

于 2013-06-28T06:10:13.960 回答