Я использовал
public static bool IsSameAsProperty(PropertyInfo first, PropertyInfo second) =>
first.DeclaringType == second.DeclaringType && first.Name == second.Name;
Чтобы определить, соответствует ли информация отраженного свойства какому-либо свойству, которое я выбрал из базового класса.
Этот подход начал разваливаться, когда я пытаюсьссылочные свойства, определенные в интерфейсах.
Например, представьте следующий сценарий многоинтерфейсного наследования:
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
, все эти выражения допустимы.Можно даже утверждать, что все они ссылаются на одно и то же свойство (хотя я могу оценить тонкие различия между объявлением интерфейса и экземпляра).
Моя проблема в том, что я хочу каким-то образом программно обнаружить, что все эти свойства«приходят из» общего интерфейса IAnimal
и совместимы.К сожалению, мой тест возвращает false
, потому что:
IDog.IsHungry
имеет DeclaringType == typeof(IAnimal)
, тогда как Dog.IsHungry
имеет DeclaringType == typeof(Animal)
IЯ не могу придумать простой способ сравнения выражений интерфейса и свойств конкретного типа, не прибегая к простому сравнению Name
(которое склонно к ложным срабатываниям) - но я не могу придумать ничего, что не связано с перечислениемвсе интерфейсы, унаследованные этими двумя типами и ищущие что-либо с именем этого свойства, которое находится в обоих наборах.
В: Можем ли мы создать функцию, которая возвращает true при сравнении любого из данных PropertyInfo, полученныхиз приведенных выше 4 выражений свойств. (например, определить, все ли они представляют / реализуют одно и то же свойство базового интерфейса?)