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

本文关键字:接口 属性 继承 获取 反射 | 更新日期: 2023-09-27 18:26:46

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

假设我们有以下接口:-

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:

要确定方法是否可重写,仅检查IsVirtual是否为true是不够的。要使方法可重写,IsVirtual必须为true,IsFinal必须为false。例如,一个方法可能是非虚拟的,但它实现了一个接口方法。

因此:

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

或者可能:

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