簡體   English   中英

如何通過擴展重載泛型方法的反映獲得方法?

[英]how to get method through reflection of extension overloaded generic method?

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));
}

例如如何通過反射優先法?

如果參數不是通用類型,則可以使用this overload of GetMethod並傳遞類型數組以匹配參數類型。在這種情況下,我可以使用linq來實現:

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

當然,您可以改進它以匹配參數類型,這只是一個示例。要了解為什么不使用GetMethod ,可以看一下這個問題

尋找適用於類的擴展方法非常棘手。 當您調用擴展方法時,編譯器將查看作用域中所有具有類型為ExtensionAttribute的方法的類型。 該擴展名由編譯器在編譯擴展方法時自動添加。

嘗試在運行時解析它們很困難,因為在執行代碼時並沒有定義范圍內的名稱空間的概念-您所擁有的只是您的類,並且不一定與擴展方法相關。 如果要在特定的類中搜索擴展方法,那很容易,您只需將GetMethod與相應的BindingFlags一起使用,並檢查Extension屬性(如果想真正實現)。 但是,如果不是這種情況,那么您將需要枚舉當前加載的所有程序集,以搜索具有靜態方法且具有與參數條件匹配的Extension屬性的公共類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM