То же самое для методов:
Мне даны два экземпляра PropertyInfo или методов, которые были извлечены из класса, в котором они находятся, через GetProperty()
или GetMember()
и т. Д. (Или, возможно, из MemberExpression).
Я хочу определить, действительно ли они ссылаются на то же свойство или тот же метод, поэтому
(propertyOne == propertyTwo)
или
(methodOne == methodTwo)
Очевидно, что это не такЕсли вы собираетесь работать, вы можете смотреть на одно и то же свойство, но оно могло быть извлечено из разных уровней иерархии классов (в этом случае обычно propertyOne != propertyTwo
)
Конечно, я мог бы взглянуть наDeclaringType и повторно запросите свойство, но это начинает немного сбивать с толку, когда вы начинаете думать о
- Свойства / Методы, объявленные на интерфейсах и реализованные на классах
- Свойства / Методы, объявленныев базовом классе (виртуально) и переопределяется в производных классах
- Свойства / методы, объявленные в базовом классе, переопределяются с помощью 'new' (в мире IL это ничегоg special 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
, кажется, просто чтобы в итоге вернуть ноль!