Равенство MethodInfo для объявления типа - PullRequest
10 голосов
/ 12 ноября 2010

Мне нужно проверить равенство между двумя MethodInfos. На самом деле они точно такие же MethodInfo, за исключением ReflectedType (то есть DeclaringType одинаков и методы должны иметь одинаковое тело) Есть несколько способов сделать это, но я ищу наиболее эффективный.

Прямо сейчас у меня есть:

    public static bool AreMethodsEqualForDeclaringType(this MethodInfo first, MethodInfo second)
    {
        first = first.ReflectedType == first.DeclaringType ? first : first.DeclaringType.GetMethod(first.Name, first.GetParameters().Select(p => p.ParameterType).ToArray());
        second = second.ReflectedType == second.DeclaringType ? second : second.DeclaringType.GetMethod(second.Name, second.GetParameters().Select(p => p.ParameterType).ToArray());
        return first == second;
    }

Это довольно дорого, поэтому мне интересно, есть ли лучший способ ...

Должен ли я вместо этого сравнивать два тела метода? например.

first.GetMethodBody() == second.GetMethodBody()

Спасибо.

Ответы [ 3 ]

3 голосов
/ 22 ноября 2010

Полагаю, я оставлю свой ответ как ответ на вопрос ...

Стоит отметить:

first.GetMethodBody() == second.GetMethodBody()

НЕ работает ... поэтому единственный ответ, который я нашел на сегодняшний день:

public static bool AreMethodsEqualForDeclaringType(this MethodInfo first, MethodInfo second)
{
    first = first.ReflectedType == first.DeclaringType ? first : first.DeclaringType.GetMethod(first.Name, first.GetParameters().Select(p => p.ParameterType).ToArray());
    second = second.ReflectedType == second.DeclaringType ? second : second.DeclaringType.GetMethod(second.Name, second.GetParameters().Select(p => p.ParameterType).ToArray());
    return first == second;
}
1 голос
/ 04 марта 2011

Будет ли сравнение MetadataToken и Module help?

Документация MetadataToken описывает его как: «Значение, которое в сочетании с модулем однозначно идентифицирует элемент метаданных».

До сих пор я обнаружил, что он работает для сравнения экземпляров MemberInfo равных-за исключением-ReflectedType. Но я не проверял его для случаев, подобных определениям общих методов.

0 голосов
/ 04 мая 2017

этот код работает, когда вы пытаетесь сравнить класс и метод интерфейса:

    static bool EquelMethods(MethodInfo method1, MethodInfo method2)
    {
        var find = method1.DeclaringType.GetMethod(method2.Name, method2.GetParameters().Select(p => p.ParameterType).ToArray());
        return find != null;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...