2014-10-29 114 views
0
public static M MustNotEqual<M, T, R>(this IMustPassRule<M, T, R> mpr, R value) 
{ 
    return mpr.MustPassRule(new NotEqualRule<R>(value)); 
} 

public static M MustNotEqual<M, T, R>(this IMustPassRule<M, T, R> mpr, R value, IEqualityComparer<R> comparer) 
{ 
    return mpr.MustPassRule(new NotEqualRule<R>(value, comparer)); 
} 

如何通過反射的第一種方法,例如?如何通過反射擴展重載泛型方法來獲取方法?

+0

你只是在尋找'typeof(ClassOfTheStaticMethods).GetMethod(「MustNotEqual」)'? – Dirk 2014-10-29 10:00:22

+0

@Dirk:鑑於存在該名稱的兩種方法,您所寫的代碼行會觸發['AmbiguousMatchException'](http://msdn.microsoft.com/en-us/library/8zz808e6.aspx)。 – 2014-10-29 10:07:08

+0

是的,我沒有真正注意方法的名稱,但看到一旦Selman22發佈他的答案會發生什麼。 – Dirk 2014-10-29 10:11:25

回答

0

如果該參數不會泛型類型,你可以使用this overload of GetMethod並傳遞一個類型數組types.In這種情況下,我會使用LINQ做匹配參數:

yourType.GetMethods(BindingFlags.Static | BindingFlags.Public) 
     .FirstOrDefault(m => m.Name == "MustNotEqual" && 
          m.GetParameters().Length == 2); 

Ofcourse,你可以改善這匹配參數類型,這只是一個例子。要了解爲什麼GetMethod不是一個選項,你可以看看this question

0

找到適用於類的擴展方法非常棘手。當您調用擴展方法時,編譯器將查看範圍內所有類型爲ExtensionAttribute的方法。編譯器在編譯擴展方法時會自動添加此擴展。

試圖在運行時解決它們是很困難的,因爲當代碼執行時沒有什麼名稱空間在範圍內的概念 - 你得到的只是你的類,它不一定與擴展方法綁定。如果您想要搜索特定類別的擴展方法,那麼很容易,只需使用GetMethod和適當的BindingFlags,並檢查Extension屬性,如果您想要真正徹底。但是,如果不是這種情況,則需要枚舉當前加載的所有程序集,以搜索具有符合參數條件的Extension屬性的靜態方法的公共類。