获得一处房产';继承中的私有setter

本文关键字:继承 setter 一处 | 更新日期: 2023-09-27 18:20:09

以下是我的代码:

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,控制台什么也不打印!

所以。。。为什么?

顺便说一句,有没有一些变通方法可以实现这一点,或者完全是另一种方法?

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

获得一处房产';继承中的私有setter

一般的解决方案是调用

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

这不是很直观,我同意。

所以。。。为什么?

A而言,Bar是只读的-您不能从A调用setter,所以当您请求关于A的属性时,没有setter是有道理的。

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

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

您只需使用属性信息中的SetValue方法就可以设置带有反射的私有属性,即使您无法获得set方法。