У меня есть экземпляр типа (типа). Как определить, переопределяет ли он 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, поэтому вы не увидите методы, которые вы только что унаследовали, но не переопределили.
- 1. Проверьте, является ли метод переопределением?
- 2. Является ли это переопределением метода или нет?
- 3. Является ли Node/Express переопределением request.ip?
- 4. Является ли текстовый якорь переопределением значения x?
- 5. Является ли jquery динамическим переопределением javascript?
- 6. Определите, является ли тип статическим
- 7. Определите, является ли устройство ARM64
- 8. Определите, является ли устройство Kindle
- 9. Определите, является ли число простым
- 10. Определите, является ли символ алфавитом
- 11. Определите, является ли аудиофайл VBR
- 12. Зачем бросать класс, который нужно сравнить перед переопределением equals()?
- 13. Определите, является ли пользователь недопустимым в IRC
- 14. Определите, является ли пользовательский ввод палиндром
- 15. Определите, является ли запрос легитимным в HttpHandler
- 16. Определите, является ли тип медиаданных изображений видео
- 17. Определите, является ли место посмеяно или нет
- 18. Определите, является ли пользователь разработчиком приложения facebook
- 19. Определите, является ли детерминант точно равным нулю
- 20. Определите, является ли поле Attachment пустым
- 21. Определите, является ли O/S Windows 7
- 22. Определите, является ли вызов функции статическим
- 23. Определите, является ли вход палиндром в C
- 24. Определите, является ли адрес электронной почты «общедоступным»
- 25. Определите, является ли операционная система Mac
- 26. Определите, является ли значение JavaScript "целочисленным"?
- 27. Определите, является ли геолокация подстрокой строки поиска
- 28. Определите, является ли процессор AMD64 или Intel64?
- 29. Определите, является ли ссылка текстом или изображением
- 30. Определите, является ли соединение мертвым на clientide
Зачем вам это нужно знать? –
Я просто играю w / Reflection и не могу понять это. Я потратил свой бюджет времени, но сейчас я нападаю на умных людей. – lance
Связанный вопрос: http://stackoverflow.com/questions/982347/how-to-determine-if-the-methodinfo-is-an-override-of-the-base-method –