为什么从接口继承的属性变成虚拟的?

时间:2018-11-27 03:58:56

标签: c# reflection

说我有一个接口和两个类,其中一个类实现了此接口:

interface IAAA
{
    int F1 { get; set; }
}

class AAA1
{
    public int F1 { get; set; }
    public int F2 { get; set; }
}

class AAA2 : IAAA
{
    public int F1 { get; set; }
    public int F2 { get; set; }
}

在类AAA2中,属性F1是从接口IAAA'继承'的(我不确定),然后我使用反射来检查属性是否是虚拟的:

Console.WriteLine("AAA1 which does not implement IAAA");
foreach (var prop in typeof(AAA1).GetProperties())
{
    var virtualOrNot = prop.GetGetMethod().IsVirtual ? "" : " not";
    Console.WriteLine($@"{prop.Name} is{virtualOrNot} virtual");
}

Console.WriteLine("AAA2 which implements IAAA");
foreach (var prop in typeof(AAA2).GetProperties())
{
    var virtualOrNot = prop.GetGetMethod().IsVirtual ? "" : " not";
    Console.WriteLine($"{prop.Name} is{virtualOrNot} virtual");
}

输出为:

AAA1 which does not implement IAAA
F1 is not virtual
F2 is not virtual
AAA2 which implements IAAA
F1 is virtual
F2 is not virtual

任何原因吗?

1 个答案:

答案 0 :(得分:34)

remarks section of MS docs起:

  

虚拟成员可以引用类中的实例数据,并且必须通过该类的实例进行引用。公共语言运行时要求所有实现接口成员的方法都必须标记为虚拟;因此,编译器将方法thereisflight(X,Y,D) :- flight(X,Y,D). flightR(A,B,FlightRoute,Distance) :- travel(A,B,[A],Q,Distance), reverse(Q,FlightRoute). travel(A,B,P,[B|P],Distance) :- thereisflight(A,B,Distance). travel(A,B,Visited,FlightRoute,Distance) :- thereisflight(A,C,Distance1), C \== B, \+member(C,Visited), travel(C,B,[C|Visited],FlightRoute,Distance2), Dist is Distance1+Distance2.

标记为

如果您需要确定此方法是否可重写,则仅检查virtual final是不够的,还需要检查IsVirtual是否为假。

这里是执行此检查的扩展方法:

IsFinal