找出属性是否被声明为虚拟

Wat*_* v2 41 c# reflection

对不起,我正在查找文档中的System.Type类型和PropertyInfo类型,但我似乎无法找到我需要的东西.

如何判断属性(或方法或任何其他成员)是否virtual在其声明类中声明?

例如

class Cat
{
    public string Name { get; set; }
    public virtual int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何判断Age财产是否被宣布virtual

Dar*_*rov 66

您可以使用IsVirtual属性:

var isVirtual = typeof(Cat).GetProperty("Age").GetGetMethod().IsVirtual;
Run Code Online (Sandbox Code Playgroud)

  • 另一个重要说明.如果Cat:ICat和ICat具有Age {get; set;},则100%的时间获取或设置方法将失败. (9认同)
  • @aBetterGamer它并没有真正失败.虚拟和可覆盖的方法之间存在差异.所以这取决于你想要确定的内容.有关更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.isvirtual.aspx. (3认同)
  • 如果所考虑的属性是只写的,则此操作将会失败。 (2认同)

cdh*_*wie 21

从技术上讲,属性不是虚拟的 - 它们的访问者是.试试这个:

typeof(Cat).GetProperty("Age").GetAccessors()[0].IsVirtual
Run Code Online (Sandbox Code Playgroud)

如果需要,可以使用如下所示的扩展方法来确定属性是否为虚拟:

public static bool? IsVirtual(this PropertyInfo self)
{
    if (self == null)
        throw new ArgumentNullException("self");

    bool? found = null;

    foreach (MethodInfo method in self.GetAccessors()) {
        if (found.HasValue) {
            if (found.Value != method.IsVirtual)
                return null;
        } else {
            found = method.IsVirtual;
        }
    }

    return found;
}
Run Code Online (Sandbox Code Playgroud)

如果它返回null,则该属性没有访问者(应该永远不会发生)或者所有属性访问者都没有相同的虚拟状态 - 至少有一个是,而一个不是虚拟的.

  • 我用 **LINQ** 解决了这个问题:`var isVirtual = prop.GetType().GetProperties() .Where(x => x.GetAccessors().Any( a => a.IsVirtual ));` (2认同)