【问题标题】:using reflection to get properties of class inheriting an interface使用反射获取继承接口的类的属性
【发布时间】:2014-10-15 13:15:08
【问题描述】:

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

假设我们有以下界面:-

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);

但是,当实现接口时,上面这行代码不会返回任何结果。如果我删除“位置”,它可以正常工作(但不会排除虚拟属性),如下所示:

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

有人知道吗?我搜索了但是我找不到任何结果。提前感谢您的帮助。

【问题讨论】:

标签: c# .net reflection system.reflection


【解决方案1】:

我怀疑你想要IsFinal

要确定一个方法是否可重写,仅检查 IsVirtual 是否为真是不够的。对于可重写的方法,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);

【讨论】:

  • 最后一行的缩进弄乱了我的强迫症!
  • “我有以下场景,我想获取实现接口的类的属性,但不包括那些虚拟属性。”。我认为这里是否虚拟是一个 side 细节(即使它占据了 OP 问题中的大部分空间)。
  • @AdrianoRepetti:我相信 OP 对未声明virtual 的属性感兴趣。将 C# 关键字“virtual”视为具有两个含义: a) 可覆盖; b) 虚拟的。
  • 是的,可能我认为他正在寻找由于接口而实现的属性(不包括那些仍然可以覆盖的属性,例如,不包括 GUID,因为它是虚拟的,因为它不在 IUser 中)。好收获!
猜你喜欢
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2017-05-12
  • 1970-01-01
  • 2011-01-09
  • 2011-10-06
相关资源
最近更新 更多