当查看类的反映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。虽然这必须是语言功能,但我想知道为什么?
能够确定属性是否被特别声明为虚拟,而不仅仅是使用一个或多个接口本质上是虚拟的,这将是很好的。这种行为背后的原因是什么?