這可能更像是一個設計問題,然後是「我能做到這一點嗎?」題。我創建了一個屬性,其目標被定義爲方法。是否有任何可能的方法對方法域施加限制,即目標方法必須聲明爲抽象,虛擬,靜態等?C#方法屬性強制要求,如抽象或靜態?
最終目標是掃描這些方法並在子類中實現它們 - 但是我希望它們是抽象的。有沒有更好的方法來完成這個限制我屬性目標的限制?
這可能更像是一個設計問題,然後是「我能做到這一點嗎?」題。我創建了一個屬性,其目標被定義爲方法。是否有任何可能的方法對方法域施加限制,即目標方法必須聲明爲抽象,虛擬,靜態等?C#方法屬性強制要求,如抽象或靜態?
最終目標是掃描這些方法並在子類中實現它們 - 但是我希望它們是抽象的。有沒有更好的方法來完成這個限制我屬性目標的限制?
你應該能夠過濾掉非使用您的屬性使用MethodInfo.IsVirtual
和MethodInfo.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
}
有幾種方法可以檢測出您列出的其他約束,方法應該類似。
編輯:修復回答方法的問題。
不,對不起。您可以在AttributeUsage
中使用Inherited
參數,但它可能對您有所幫助。
編輯:我知道這個帖子並沒有直接解決你的問題,但你可以應用一些論述了校長:
Restrict custom attribute so that it can be applied only to Specifc types in C#?
感謝您的評論;在執行方面(即當我處理它們時),我會做你列出的檢查。然而,也許我的問題措辭不好,我想避免混淆我的最終用戶,這是我的屬性裝飾他們的方法。比方說,他們有一個非虛擬的,非抽象的方法,他們把我的屬性放在 - 我不能在方法上執行我的操作,但我也不能拋出異常來破壞他們的程序。我希望CLR可以通過強加一個不會讓罪犯過去編譯的限制來抓住這一點。 – OnResolve 2012-03-06 17:35:56
在運行時或編譯器中沒有任何東西可以讓你在你要找的級別掛鉤。我相信這是Roslyn在未來允許你做的事情。作爲替代方案,您可以編寫一個瘦控制檯應用程序,用戶可以在後期構建操作中運行這些操作,這些操作會反映構建的程序集,執行這些檢查,並轉儲出不符合的任何方法。 – 2012-03-06 17:38:24