c# - 判断两个不同的 PropertyInfo 是否来自同一个接口(interface)?

标签 c# .net reflection .net-4.5

我一直在用

public static bool IsSameAsProperty(PropertyInfo first, PropertyInfo second) =>
     first.DeclaringType == second.DeclaringType && first.Name == second.Name;

为了确定反射的属性信息是否与我从基类中获取的某些属性相匹配。

当我尝试引用接口(interface)中定义的属性时,这种方法开始崩溃。

例如,想象以下多接口(interface)继承场景:

interface IAnimal : { bool IsHungry { get; } }
interface IDog : IAnimal { }

abstract class Animal : IAnimal { public bool IsHungry { get; set; } }
class Dog : Animal, IDog { }

如果我正在创建属性表达式,则以下所有内容均有效:

Expression<Func<object, bool>> propertyExpression;
propertyExpression = (IAnimal animal) => animal.IsHungry
propertyExpression = (Animal animal) => animal.IsHungry
propertyExpression = (IDog dog) => dog.IsHungry
propertyExpression = (Dog dog) => dog.IsHungry

由于这些类型中的每一个都定义或继承了属性 IsHungry,所以所有这些表达式都是有效的。有人甚至可能会争辩说它们都指的是同一个属性(尽管我可以理解接口(interface)和实例声明之间的细微差别)。

我的问题是我想要某种方式以编程方式检测所有这些属性“来自”共享接口(interface) IAnimal 并且是兼容的。不幸的是,我的测试返回 false 因为:

  • IDog.IsHungryDeclaringType == typeof(IAnimal)
  • Dog.IsHungryDeclaringType == typeof(Animal)

我想不出一种简单的方法来比较接口(interface)和具体类型的属性表达式,而不求助于简单的 Name 比较(这很容易出现误报) - 但我不能想一想任何不涉及枚举这两种类型继承的所有接口(interface)并在两个集合中查找具有该属性名称的任何东西的事情。


问:我们能否创建一个函数,在比较上述 4 个属性表达式产生的 PropertyInfo 中的任何一个时返回 true。(例如,检测到它们都表示/实现相同的基本接口(interface)属性?)

最佳答案

在使用 new 关键字隐藏继承属性的情况下,这可能会导致误报,但是:

public static bool IsSameAsProperty(PropertyInfo first, PropertyInfo second) =>
    first == second || // If default equals implementation returns true, no doubt
    first.Name == second.Name && (
        first.DeclaringType == second.DeclaringType ||
        first.DeclaringType.IsAssignableFrom(second.DeclaringType) ||
        second.DeclaringType.IsAssignableFrom(first.DeclaringType));

我想我可以更具体一点,检查是否 first.DeclaringType.IsInterface ,反之亦然,但仍然可以显式实现该接口(interface)并使用新接口(interface)隐藏其属性相同的名称,因此额外的检查不会使它“更安全”。

不确定我能否判断一个 PropertyInfo 实例是否代表另一个的接口(interface)实现。

关于c# - 判断两个不同的 PropertyInfo 是否来自同一个接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55188298/

相关文章:

.net - Entity Framework 架构中的有界 (Db) 上下文

c# - 如果只使用一次,使用局部函数有什么意义吗?

c# - 如何将动态对象转换为类型并进行比较

.net - .net核心中是否有DBSet.UpdateAsync()和RemoveAsync()?

.net - orchard cms 在 cms 中创建页面

java - 使用反射时处理或转换从 method.invoke() 返回的对象

c# - 如何获取 Queryable.Join 的 MethodInfo

Java:获取带有接口(interface)参数的方法及其实现

c# - 单击按钮时禁用选中的复选框

c# - 如何使用 LINQ 在字典中查找元素