我有这堂课:
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
。即使该属性未明确标记为虚拟,为什么会发生?
答案 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。