我一直在用
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.IsHungry
有DeclaringType == typeof(IAnimal)
而Dog.IsHungry
有DeclaringType == 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/