2010-11-12 64 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; 
    }