PropertyInfo.GetSetMethod(true) не возвращает метод для свойств из базового класса
У меня есть следующая тестовая программа:
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 ответа
Вы можете достичь этого, получив 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();
}
}
Это по замыслу. Установщик свойства FooBase недоступен в классе Foo, что бы вы ни пытались:
public class Foo : FooBase {
void Test() {
Prop = new object(); // No
((FooBase)this).Prop = new object(); // No
}
}
Вам нужно будет использовать typeof(FooBase).GetProperty("Prop") в вашем коде.
РЕДАКТИРОВАТЬ
Сожалею,
Вы правы в своем комментарии ниже. Ошибка другая. В классе Foo нет метода set, поэтому он не возвращает метод. Его нет, потому что он является частным в базовом классе.