为什么在实现接口时将属性标记为虚拟?

时间:2016-06-21 04:20:53

标签: c# interface virtual propertyinfo

当查看类的反映PropertyInfo时,我发现属性在实现声明该属性的接口时被标记为虚拟。

class Program
{
    public interface IWhatever
    {
        long? Id { get; set; }
    }

    public class Whatever : IWhatever
    {
        public long? Id { get; set; }
    }

    static void Main(string[] args)
    {
        var properties = typeof(Whatever)
            .GetProperties()
            .Where(_ => _.GetMethod?.IsPublic ?? false)
            .Where(_ => !_.GetMethod.IsVirtual)
            .Where(_ => _.SetMethod?.IsPublic ?? false)
            .Where(_ => !_.SetMethod.IsVirtual)
            .Select(_ => _.Name)
            .ToArray();

        Console.WriteLine(string.Join(", ", properties));
    }
}

如果我运行该代码,则不会报告任何属性,因为Id Get / Set标记为IsVirtual。如果删除接口,则返回Id,因为IsVirtual为false。虽然这必须是语言功能,但我想知道为什么?

能够确定属性是否被特别声明为虚拟,而不仅仅是使用一个或多个接口本质上是虚拟的,这将是很好的。这种行为背后的原因是什么?

0 个答案:

没有答案