我有以下测试程序:
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中的错误吗?
答案 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方法,这就是它没有返回方法的原因。它不存在,因为它在基类中是私有的。