2017-01-09 4 views
1

У меня есть этот класс:метод GetAccessors Property Info Возвращение IsVirtual для невиртуальной собственности

public class Model : IModel 
{ 
    public int Id {get; set;} 
} 

public interface IModel 
{ 
    int Id {get; } 
} 

я получаю информацию собственности следующим образом:

var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
var property = properties[0]; 

var isVirtual = property.GetAccessors()[0].IsVirtual; 

isVirtual является true. Почему это происходит, даже если свойство явно не помечено как виртуальное?

ответ

1

Возможно, вы проверяете IsVirtual против интерфейса IModel. Следовательно, он возвращается к истине. Это связано с тем, что:

Аксессуар свойства интерфейса не имеет тела. Таким образом, цель аксессоров заключается в том, чтобы указать, является ли свойство для чтения-записи, только для чтения или для записи.

Источник: MSDN

Кроме того, если смотреть в IL кодекс, вы бы увидели

Для интерфейса:

.method public hidebysig newslot specialname abstract virtual 
    instance int32 get_Id() cil managed 

Для класса:

.method public hidebysig newslot specialname virtual final 
      instance int32 get_Id() cil managed 

Записка final в IL (или Sealed in C#), это предотвращает производный класс, переопределяющий метод интерфейса. Если вы явно указали метод как виртуальный, компилятор помечает метод как виртуальный (и не окончательный), позволяющий производному классу переопределить метод интерфейса. Таким образом, виртуальный в сигнатуре является способом, которым время выполнения обеспечивает полиморфное поведение и больше похоже на детали реализации.

Итак, если вы проверите IsVirtual против класса Model, он вернет false.

+0

Я проверяю «Модель», потому что «T» - это конкретный класс. Кроме того, возвращаемые свойства возвращаются в класс 'Model', а не только в' IModel'. –

+0

Можете ли вы проверить с помощью модели непосредственно вместо T – usercr

+0

Весь метод является расширением для 'IEnumerable '. а не для определенного класса. –