PropertyInfo.GetSetMethod(true)不返回基类属性的方法

时间:2011-07-02 14:11:17

标签: .net reflection

我有以下测试程序:

public class FooBase
{
  public object Prop {
    get { return null; }
    private set { } 
  }
}
public class Foo :FooBase
{
}
class Program
{
  static void Main(string[] args)
  {
    MethodInfo setMethod = typeof(Foo).GetProperty("Prop").GetSetMethod(true);
    if (setMethod==null)
      Console.WriteLine("NULL");
    else
      Console.WriteLine(setMethod.ToString());
    Console.ReadKey(); 
  }
}

如果我运行它会显示“NULL”。如果我将属性定义移动到类Foo,那么我按预期工作。这是.NET中的错误吗?

3 个答案:

答案 0 :(得分:6)

你可以通过在属性的声明类型上获取PropertyInfo来实现它,简单的扩展方法可以是......

public static class Extensions
{
   public static MethodInfo GetSetMethodOnDeclaringType(this PropertyInfo propertyInfo)
   {
       var methodInfo = propertyInfo.GetSetMethod(true);
       return methodInfo ?? propertyInfo
                               .DeclaringType
                               .GetProperty(propertyInfo.Name)
                               .GetSetMethod(true);
   }
}

然后你的调用代码会......

class Program
{
    static void Main(string[] args)
    {
       MethodInfo setMethod = typeof(Foo)
                                 .GetProperty("Prop")
                                 .GetSetMethodOnDeclaringType();
       if (setMethod == null)
            Console.WriteLine("NULL");
        else
            Console.WriteLine(setMethod.ToString());
         Console.ReadKey();
    }
}

答案 1 :(得分:5)

这是设计的。无论您尝试什么,都无法在Foo类中访问FooBase属性设置器:

public class Foo : FooBase {
    void Test() {
        Prop = new object();  // No
        ((FooBase)this).Prop = new object();  // No
    }
}

您必须在代码中使用typeof(FooBase).GetProperty(“Prop”)。

答案 2 :(得分:3)

修改

对不起,

您的评论如下。错误是不同的。 Foo类中没有set方法,这就是它没有返回方法的原因。它不存在,因为它在基类中是私有的。