属性信息的GetAccessors方法返回非虚拟属性的IsVirtual

时间:2017-01-09 14:45:43

标签: c# reflection

我有这堂课:

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 个答案:

答案 0 :(得分:1)

您可能正在针对接口IModel检查IsVirtual。因此,它返回真实。这是因为:

  

interface属性的访问者没有正文。因此,访问器的目的是指示属性是读写,只读还是只写。

来源: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

注意IL中的final(或C#中的密封),这可以防止派生类重写接口方法。如果将方法明确标记为虚拟,则编译器将该方法标记为虚拟(并且不是最终),允许派生类覆盖接口方法。因此,签名中的虚拟是运行时提供多态行为的方式,更像是实现细节。

因此,如果针对类Model检查IsVirtual,它将返回false。