在VB.NET或C#中,有沒有方法可以確定一個類是否已被擴展爲extension methods?是否有可能知道一個類是否被擴展方法擴展?
回答
編輯:現在的問題已改爲參考擴展方法(這可能是也可能不是OP的意圖) - 不,你不能告訴一個類型是否是擴展方法的目標,除非它是一個靜態類(在這種情況下,它不能這樣使用),除非你知道所有相關的潛在裝配。
擴展方法是在靜態非通用頂級類型只是一個靜態方法,裝飾有一個屬性。你有效地問這種方法是否存在。你可以迭代你關心的所有程序集中的所有方法,試圖找到一個針對該類型的擴展方法,但僅此而已。
原來的答覆,當問題沒有提到的擴展方法
如果你知道所有在它可能擴展的組件,你可以使用Assembly.GetTypes
和Type.IsSubclassOf
檢查他們每個人。
如果類是未密封並且不包含內部抽象成員(即,它可以加長),那麼就可以不告訴其他一些,卸載組件是否含有一個子類,沒有。每個班級「知道」其父母,但不瞭解其子女。
@Downvoter:關心評論? –
謝謝你雙重答案:-)我從兩方面瞭解到。 –
如果一個類是受保護的,或公開,幾乎沒有辦法來確定它是否延長或不。
如果要在裝配體內或裝配過程中(所有裝入的裝配體)確定,可以使用Type.IsSubclassOf
或Type.IsAssignableForm
進行檢查。
如果你想確定在編譯時(無需實際執行)的解決方案中,只是使構造私有,或將類標記爲密封,編譯解決方案,並檢查所有的相關的錯誤。完成後,恢復更改。
無法知道某個類是否使用擴展方法進行了擴展。將擴展方法看作靜態過程,這些靜態過程在不同的項目中只會有微弱差別。
擴展方法不產生任何新的類型,也可以永不覆蓋真正的成員方法(因此,直到你開始直接打電話給他們,他們不能以任何方式改變對象的行爲)。因此,您可能不需要需要來檢測它們的存在。
可以確定某個特定方法是擴展方法還是真正的成員方法。也可以使用反射在特定的加載程序集中列出所有擴展方法。這是解釋here。
- 1. 是否有可能擴展一個庫類擴展MY_Controller類
- 2. 是否可以使用擴展方法擴展泛型類?
- 3. 是否可以擴展類
- 4. 是否有可能巢內的另一個擴展方法?
- 5. 是否有可能在本地擴展chrome擴展中的css?
- 6. 是否有可能重寫這個棘手的擴展方法?
- 7. 是否有可能擴展超過一個抽象類?
- 8. 如何知道某個類是否擴展了JWindow類?
- 9. 這個擴展方法是否安全?
- 10. 是否可以擴展DefaultValueAccessor?
- 11. 是否可以擴展DataColumn.Expression
- 12. 是否可以從擴展
- 13. silverlight是否可擴展?
- 14. 是否有可能在PHP擴展中有多個類?
- 15. 是否有可能評估類接口是否擴展某個基類?
- 16. 是否有可能爲F#元組創建擴展方法
- 17. 是否有可能將數據綁定到擴展方法?
- 18. 「擴展」是否也擴展變量?
- 19. 是否可以擴展私人功能?
- 20. 可能檢查一個類是否在PHP中擴展?
- 21. 編譯器如何知道是否要擴展零或一個?
- 22. Laravel 4 - 是否可以擴展DB類?
- 23. 是否可以「擴展」財產「類」?
- 24. 如果一個類擴展了另一個類,擴展類可以被初始化而不是擴展它嗎?
- 25. 類擴展的語法是否更改?
- 26. 類別方法是否可以擴展到子類?
- 27. 擴展方法是否太貴?
- 28. LESS是否具有「擴展」功能?
- 29. 是否可以有一個類擴展號碼?
- 30. 是否有一個簡單的可擴展的ASP.NET數據類?
http://stackoverflow.com/questions/299515/c-sharp-reflection-to-identify-extension-methods –
在編輯時或運行時? – Jamiec
你是指擴展方法還是繼承?無論哪種方式,這兩種替代方案實際上已被回答lol –