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

kra*_*afo 3 .net c# reflection system.reflection

我有以下场景,我想获得实现接口的类的属性,但不包括那些虚拟的属性.为了说清楚,我将给你一个小例子: -

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

public interface IUser
{
    int UserID { get; set; }
    string FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

实现此接口的类: -

public class User: IUser
{
    public int UserID { get; set; }
    public string FirstName { get; set; }
    public virtual int GUID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

var entityProperties = typeof(User).GetProperties()
                                   .Where(p => p.GetMethod.IsVirtual == false);
Run Code Online (Sandbox Code Playgroud)

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

var entityProperties = typeof(User).GetProperties();
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 7

我怀疑你想要IsFinal:

要确定方法是否可覆盖,仅检查IsVirtual是否为true是不够的.对于可覆盖的方法,IsVirtual必须为true且IsFinal必须为false.例如,方法可能是非虚拟的,但它实现了一种接口方法.

所以:

var entityProperties = typeof(User).GetProperties()
                                   .Where(p => p.GetMethod.IsFinal);
Run Code Online (Sandbox Code Playgroud)

或者可能:

var entityProperties = typeof(User).GetProperties()
                                   .Where(p => !p.GetMethod.IsVirtual ||
                                               p.GetMethod.IsFinal);
Run Code Online (Sandbox Code Playgroud)

  • @AdrianoRepetti:我相信OP对那些没有*声明为*virtual`的属性感兴趣.可以将C#关键字"虚拟"视为具有两个含义:a)可覆盖; b)虚拟. (2认同)