2010-11-12 65 views
9

我需要检查两个MethodInfos之间的相等性。它们实际上是与ReflectedType完全相同的MethodInfo(也就是说,DeclaringType是相同的,并且这些方法实际上应该具有相同的主体)。有很多方法可以做到这一点,但我正在寻找最高效的方法。MethodInfo声明类型的平等

现在我有:

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() 

谢谢。

+0

为什么你就不能直接比较,申报类型,而下摆比较反射的类型?我也很想知道为什么你需要这样做。 – jgauffin 2010-11-13 13:59:12

+1

绝对可以比较声明的类型,但它更昂贵,因为它需要调用GetParameters(),而如果ReflectedTypes相等,我可以只进行常规的相等性检查。 – Jeff 2010-11-13 18:12:13

+1

我需要这样做,因为我在运行时创建了由EntityFramework创建的Proxy类,我正在做一些反思。 – Jeff 2010-11-13 18:13:11

回答

3

我想我会离开我的答案的问题的答案......

有一点需要注意:

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; 
} 
+0

方法体有一个字节[],它是方法体的IL,你可以比较这些字节而不是只使用“==”。 – 2012-08-20 21:17:22

+0

@Jeff。我知道我已经晚了十年,但是......你还在使用这段代码吗?我需要类似的东西,但不想发明一个轮子。 [Ayende发表了这篇文章](http://ayende.com/blog/2658/method-equality),你一定看过。欣赏任何反馈。干杯 – Berryl 2013-04-01 01:46:13

1

会比较MetadataTokenModule帮助?

MetadataToken的文档将其描述为:“与Module组合使用,唯一标识元数据元素的值”。

到目前为止,我发现它可以用于比较equal-except-for-ReflectedType MemberInfo实例。但是我没有像泛型方法定义那样测试它。

+0

谢谢,但这是特别的情况下不起作用。 – Jeff 2011-03-04 23:16:53

0

此代码的工作,当您尝试等于类和接口的方法:

static bool EquelMethods(MethodInfo method1, MethodInfo method2) 
    { 
     var find = method1.DeclaringType.GetMethod(method2.Name, method2.GetParameters().Select(p => p.ParameterType).ToArray()); 
     return find != null; 
    }