2017-01-09 124 views
1

我有這個類:房產信息的GetAccessors方法返回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; 

isVirtualtrue。即使該屬性未明確標記爲虛擬,爲什麼會發生?

回答

1

您可能正在針對接口IModel檢查IsVirtual。因此,它迴歸真實。這是因爲:

接口屬性的訪問器沒有主體。因此,訪問器的目的是指示屬性是讀寫型,只讀型還是隻寫型。

來源:MSDN

而且,如果考慮IL代碼,你會看到

對於接口:

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

對於Class:

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

注意final在IL(或C#中的密封)中,這可以防止派生類重寫接口方法。如果您明確將該方法標記爲虛擬,則編譯器將該方法標記爲虛擬(並且不是最終的),從而允許派生類覆蓋該接口方法。因此,虛擬簽名是運行時提供多態行爲的方式,更像實現細節。

所以,如果您檢查IsVirtual對類Model,它將返回false。

+0

我正在檢查'Model',因爲'T'是具體的類。此外,返回的屬性是'Model'類中的屬性,而不僅僅是'IModel'中的屬性。 –

+0

你可以直接用Model檢查而不是T – usercr

+0

整個方法是'IEnumerable '的擴展。而不是針對某個班級。 –