Технически свойства не являются виртуальными - их методы доступа есть. Попробуйте это:
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
, либо свойство не имеет средств доступа (что никогда не должно происходить), либо все средства доступа к свойствам не имеют одинакового виртуального статуса - по крайней мере, один является, а один не является виртуальным.