首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查看属性是否被声明为虚拟的

查看属性是否被声明为虚拟的
EN

Stack Overflow用户
提问于 2010-11-22 16:21:37
回答 5查看 21.6K关注 0票数 47

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

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

例如

代码语言:javascript
复制
class Cat
{
    public string Name { get; set; }
    public virtual int Age { get; set; }
}

如何判断Age属性是否被声明为virtual

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-22 16:23:46

您可以使用IsVirtual属性:

代码语言:javascript
复制
var isVirtual = typeof(Cat).GetProperty("Age").GetGetMethod().IsVirtual;
票数 80
EN

Stack Overflow用户

发布于 2010-11-22 16:24:48

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

代码语言:javascript
复制
typeof(Cat).GetProperty("Age").GetAccessors()[0].IsVirtual

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

代码语言:javascript
复制
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;
}

如果返回null,则要么该属性没有访问器(这种情况永远不会发生),要么所有属性访问器都不具有相同的虚拟状态--至少有一个是虚拟的,而另一个不是虚拟的。

票数 25
EN

Stack Overflow用户

发布于 2019-10-31 21:49:11

单独的IsVirtual对我不起作用。它告诉我,我所有的非虚拟不可空属性都是虚拟的。我不得不使用IsFinal和IsVirtual的组合

这是我最终得到的结论:

代码语言:javascript
复制
PropertyInfo[] nonVirtualProperties = myType.GetProperties().Where(x => x.GetAccessors()[0].IsFinal || !x.GetAccessors()[0].IsVirtual).ToArray();

PropertyInfo[] virtualProperties = myType.GetProperties().Where(x => !x.GetAccessors()[0].IsFinal && x.GetAccessors()[0].IsVirtual).ToArray();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4243541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档