加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用反射来获取继承接口的类的属性

发布时间:2020-12-16 02:03:34 所属栏目:百科 来源:网络整理
导读:我有以下场景,我想获得实现接口的类的属性,但不包括那些虚拟的属性.为了说清楚,我将给你一个小例子: – 想象一下,我们有以下界面: – public interface IUser{ int UserID { get; set; } string FirstName { get; set; }} 实现此接口的类: – public clas
我有以下场景,我想获得实现接口的类的属性,但不包括那些虚拟的属性.为了说清楚,我将给你一个小例子: –

想象一下,我们有以下界面: –

public interface IUser
{
    int UserID { get; set; }
    string FirstName { get; set; }
}

实现此接口的类: –

public class User: IUser
{
    public int UserID { get; set; }
    public string FirstName { get; set; }
    public virtual int GUID { get; set; }
}

现在,我想要做的是获取除了虚拟的类的属性.当类没有实现接口时,以下工作正常: –

var entityProperties = typeof(User).GetProperties()
                                   .Where(p => p.GetMethod.IsVirtual == false);

但是,当实现接口时,上面的代码行不会返回任何结果.如果我删除’where’它工作正常(但虚拟属性不会被排除),如下所示:

var entityProperties = typeof(User).GetProperties();

有人有任何想法吗?我搜索但是我无法找到任何结果.在此先感谢您的帮助.

解决方法

我怀疑你想要 IsFinal

To determine if a method is overridable,it is not sufficient to check that IsVirtual is true. For a method to be overridable,IsVirtual must be true and IsFinal must be false. For example,a method might be non-virtual,but it implements an interface method.

所以:

var entityProperties = typeof(User).GetProperties()
                                   .Where(p => p.GetMethod.IsFinal);

或者可能:

var entityProperties = typeof(User).GetProperties()
                                   .Where(p => !p.GetMethod.IsVirtual ||
                                               p.GetMethod.IsFinal);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读