То же самое и для методов:
Мне даны два экземпляра PropertyInfo или методы, которые были извлечены из класса, в котором они находятся, через GetProperty()
или GetMember()
и т.д. (или, возможно, из MemberExpression).
Я хочу определить, действительно ли они ссылаются на одно и то же свойство или тот же метод, поэтому
(propertyOne == propertyTwo)
или
(methodOne == methodTwo)
Очевидно, что на самом деле это не работает, вы можете искать одно и то же свойство, но оно могло быть извлечено с разных уровней иерархии классов (в общем случае propertyOne != propertyTwo
)
Конечно, я мог бы посмотреть DeclaringType и повторно запросить свойство, но это начинает немного запутываться, когда вы начинаете думать о
- Свойства/методы, объявленные на интерфейсах и реализованные в классах
- Свойства/методы, объявленные в базовом классе (фактически) и переопределенные на производных классах
- Свойства/методы, объявленные в базовом классе, переопределенные "новым" (в мире IL это ничего особенного iirc)
В конце дня, я просто хочу иметь возможность провести интеллектуальную проверку равенства между двумя свойствами или двумя методами, я уверен, что на 80% выше, чем выше, и хотя я мог просто сесть, написать кучу тестов и начать играть, я хорошо знаю, что мои низкоуровневые знания о том, как эти концепции фактически реализованы, не являются превосходными, и я надеюсь, что это уже ответившая тема и я просто сосать в поиске.
Лучший ответ дал бы мне пару методов, которые достигли бы вышеуказанного, объясняя, к каким краям дела позаботились и почему: -)
Разъяснение
Буквально, я хочу убедиться, что они являются одним и тем же свойством, вот несколько примеров
public interface IFoo
{
string Bar { get; set; }
}
public class Foo : IFoo
{
string Bar { get; set; }
}
typeof(IFoo).GetProperty("Bar")
и
typeof(Foo).GetProperty("Bar")
Вернет две информации свойства, которые не равны:
public class BaseClass
{
public string SomeProperty { get; set ; }
}
public class DerivedClass : BaseClass { }
typeof(BaseClass).GetMethod("SomeProperty")
и
typeof(DerivedClass).GetProperty("SomeProperty")
На самом деле я не могу вспомнить, возвращаются ли эти два равных объекта, но в моем мире они равны.
Аналогично:
public class BaseClass
{
public virtual SomeMethod() { }
}
public class DerivedClass
{
public override SomeMethod() { }
}
typeof(BaseClass).GetMethod("SomeMethod")
и
typeof(DerivedClass).GetProperty("SomeMethod")
Опять же, они не совпадут, но я хочу, чтобы они (я знаю, что они не являются точно равными, но в моем домене они связаны с тем, что они относятся к тому же оригинальному свойству)
Я мог бы сделать это структурно, но это было бы "неправильно".
Дополнительные заметки:
Как вы даже запрашиваете свойство, скрывающее другое свойство? Кажется, одно из моих предыдущих предположений было недействительным, что по умолчанию реализация GetProperty("name")
будет ссылаться на текущий уровень по умолчанию.
BindingFlags.DeclaringType
появляется только для того, чтобы вернуть null!