2010-09-02 3 views
3

У меня есть экземпляр типа (типа). Как определить, переопределяет ли он Equals()?Определите, является ли Equals() переопределением?

+1

Зачем вам это нужно знать? –

+0

Я просто играю w ​​/ Reflection и не могу понять это. Я потратил свой бюджет времени, но сейчас я нападаю на умных людей. – lance

+0

Связанный вопрос: http://stackoverflow.com/questions/982347/how-to-determine-if-the-methodinfo-is-an-override-of-the-base-method –

ответ

6
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.

+1

Мне любопытно, почему вы используете Linq с IsObejectEqualsMethod, когда можете вызвать type.GetMethod («Equals», new Type [] {typeof (object)) Есть ли какая-то польза или поведение, которого я пропускаю? это просто Linq-y? – Hounshell

+0

@ Hounshell: На секунду я задавался вопросом, почему я сам, но я только что вспомнил. Если тип содержит скрытие 'public new bool Equals (object obj)', мы будем рассуждать о неправильный метод.Я согласен, что используемая техника, которую я использую для решения этой проблемы, невелика, но знаете ли вы о лучшем решении? – Ani

+0

Отличный ответ. Гораздо короче моего, и все еще проходит все мои странные тестовые примеры. скрытие: http://nopaste.info/bd9b052f8d_nl.html – CodesInChaos

0

Если вы перечисляете все методы типа, используйте BindingFlags.DeclaredOnly, поэтому вы не увидите методы, которые вы только что унаследовали, но не переопределили.

Смежные вопросы