2012-03-06 93 views
4

這可能更像是一個設計問題,然後是「我能做到這一點嗎?」題。我創建了一個屬性,其目標被定義爲方法。是否有任何可能的方法對方法域施加限制,即目標方法必須聲明爲抽象,虛擬,靜態等?C#方法屬性強制要求,如抽象或靜態?

最終目標是掃描這些方法並在子類中實現它們 - 但是我希望它們是抽象的。有沒有更好的方法來完成這個限制我屬性目標的限制?

回答

3

你應該能夠過濾掉非使用您的屬性使用MethodInfo.IsVirtualMethodInfo.IsAbstract來裝飾虛擬方法,以確定它是否是抽象的。

foreach(var assem in AppDomain.CurrentDomain.GetAssemblies()) 
    foreach (var type in assem.GetTypes()) 
     foreach (var mthdInfo in type.GetMethods()) 
     { 
      if (mthdInfo.GetCustomAttributes(typeof(MyCustomAttribute), false) && mthdInfo.IsVirtual && !mthdInfo.IsFinal) 
       // This is a method you can use 
     } 

有幾種方法可以檢測出您列出的其他約束,方法應該類似。

編輯:修復回答方法的問題。

+0

感謝您的評論;在執行方面(即當我處理它們時),我會做你列出的檢查。然而,也許我的問題措辭不好,我想避免混淆我的最終用戶,這是我的屬性裝飾他們的方法。比方說,他們有一個非虛擬的,非抽象的方法,他們把我的屬性放在 - 我不能在方法上執行我的操作,但我也不能拋出異常來破壞他們的程序。我希望CLR可以通過強加一個不會讓罪犯過去編譯的限制來抓住這一點。 – OnResolve 2012-03-06 17:35:56

+0

在運行時或編譯器中沒有任何東西可以讓你在你要找的級別掛鉤。我相信這是Roslyn在未來允許你做的事情。作爲替代方案,您可以編寫一個瘦控制檯應用程序,用戶可以在後期構建操作中運行這些操作,這些操作會反映構建的程序集,執行這些檢查,並轉儲出不符合的任何方法。 – 2012-03-06 17:38:24

相關問題