У меня есть экземпляр типа (типа). Как определить, переопределяет ли он Equals()?Определите, является ли Equals() переопределением?
ответ
private static bool IsObjectEqualsMethod(MethodInfo m)
{
return m.Name == "Equals"
&& m.GetBaseDefinition().DeclaringType.Equals(typeof(object));
}
public static bool OverridesEqualsMethod(this Type type)
{
var equalsMethod = type.GetMethods()
.Single(IsObjectEqualsMethod);
return !equalsMethod.DeclaringType.Equals(typeof(object));
}
Обратите внимание, что это показывает, имеет ли object.Equals
подменен где-нибудь в иерархии наследования type
. Для того, чтобы определить, если переопределение объявлено на самом типе, вы можете изменить условие
equalsMethod.DeclaringType.Equals(type)
EDIT: Вымытый метод IsObjectEqualsMethod
.
Мне любопытно, почему вы используете Linq с IsObejectEqualsMethod, когда можете вызвать type.GetMethod («Equals», new Type [] {typeof (object)) Есть ли какая-то польза или поведение, которого я пропускаю? это просто Linq-y? – Hounshell
@ Hounshell: На секунду я задавался вопросом, почему я сам, но я только что вспомнил. Если тип содержит скрытие 'public new bool Equals (object obj)', мы будем рассуждать о неправильный метод.Я согласен, что используемая техника, которую я использую для решения этой проблемы, невелика, но знаете ли вы о лучшем решении? – Ani
Отличный ответ. Гораздо короче моего, и все еще проходит все мои странные тестовые примеры. скрытие: http://nopaste.info/bd9b052f8d_nl.html – CodesInChaos
Если вы перечисляете все методы типа, используйте BindingFlags.DeclaredOnly, поэтому вы не увидите методы, которые вы только что унаследовали, но не переопределили.
Зачем вам это нужно знать? –
Я просто играю w / Reflection и не могу понять это. Я потратил свой бюджет времени, но сейчас я нападаю на умных людей. – lance
Связанный вопрос: http://stackoverflow.com/questions/982347/how-to-determine-if-the-methodinfo-is-an-override-of-the-base-method –