Узнайте, объявлено ли свойство виртуальным - PullRequest
38 голосов
/ 22 ноября 2010

Извините, я ищу в документации тип System.Type и тип PropertyInfo, но не могу найти нужную вещь.

Как узнать, было ли свойство (или метод, или любой другой элемент) объявлено virtual в объявленном классе?

Например,

class Cat
{
    public string Name { get; set; }
    public virtual int Age { get; set; }
}

Как узнать, было ли объявлено свойство Age virtual или нет?

Ответы [ 3 ]

62 голосов
/ 22 ноября 2010

Вы можете использовать свойство IsVirtual :

var isVirtual = typeof(Cat).GetProperty("Age").GetGetMethod().IsVirtual;
20 голосов
/ 22 ноября 2010

Технически свойства не являются виртуальными - их методы доступа есть. Попробуйте это:

typeof(Cat).GetProperty("Age").GetAccessors()[0].IsVirtual

Если вы хотите, вы можете использовать метод расширения, подобный следующему, чтобы определить, является ли свойство виртуальным:

public static bool? IsVirtual(this PropertyInfo self)
{
    if (self == null)
        throw new ArgumentNullException("self");

    bool? found = null;

    foreach (MethodInfo method in self.GetAccessors()) {
        if (found.HasValue) {
            if (found.Value != method.IsVirtual)
                return null;
        } else {
            found = method.IsVirtual;
        }
    }

    return found;
}

Если возвращается null, либо свойство не имеет средств доступа (что никогда не должно происходить), либо все средства доступа к свойствам не имеют одинакового виртуального статуса - по крайней мере, один является, а один не является виртуальным.

0 голосов
/ 08 декабря 2018

Если класс наследует от интерфейса, все свойства в интерфейсе помечаются как виртуальные. Если вы хотите проверить, является ли свойство перезаписываемым, вы должны проверить, что IsFinal также имеет значение false

public static bool IsPropertyOverridable(this PropertyInfo propertyInfo)
{
    return (propertyInfo.IsGetPropertyVirtual() || propertyInfo.IsSetPropertyOverridable());
}

public static bool IsGetPropertyVirtual(this PropertyInfo propertyInfo)
{
    if (false == propertyInfo.CanRead)
    {
        return false;
    }
    return propertyInfo.GetGetMethod(nonPublic: true).IsOverridable();
}

public static bool IsSetPropertyOverridable(this PropertyInfo propertyInfo)
{
    if (false == propertyInfo.CanWrite)
    {
        return false;
    }
    return propertyInfo.GetSetMethod(nonPublic: true).IsOverridable();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...