2009-04-21 73 views
2

是否可以限制屬性在特定類中應用的數量?C#屬性限制

+1

號爲什麼你想這樣做? – 2011-05-23 03:19:32

回答

3

在編譯時沒有。

在運行時你可以通過一個靜態初始化器來驗證它,如果這個不變量被違反,這個靜態初始化器將會拋出,儘管這會被認爲是非常糟糕的風格,它將是安全的,因爲在不變量不成立時不能執行代碼。

如果你對擴展固有的.Net,即使你可以在編譯時驗證這一點想象:

編譯DLL中的一個與

public class Foo 
{ 
    public int Property1 {get;} 
} 

編譯DLL乙引用A.DLL與

public class Bar 
{ 
    [OnlyOneAllowedOnAnyPropertiesPerClass] 
    public int Property2 {get;} 
} 

然後重新編譯A.DLL與

public class Foo 
{ 
    [OnlyOneAllowedOnAnyPropertiesPerClass] 
    public int Property1 {get;} 
} 

並嘗試運行與老B.DLL這個新A.DLL(它們是二進制兼容的在所有其他方面,所以這是很好)

顯然,運行時會做很大的努力健全檢查這,不提及B可能會突然加載一段時間使A和B之一或兩者「非法」。

因此,您不應該期望這個功能在框架中可用。

1

我不認爲這是可能的在編譯時。但是你可以添加一些代碼給實例構造函數或者一個靜態構造函數,它在運行時通過反射來檢查它。

1

如果它是重要的(或右後)編譯的時候,你應該創建一個FxCop規則或爲您的屬性(模式像[OnlyOnceAttribute])自定義搜索。

findstr "[OnlyOnceAttribute]" *.cs 

FINDSTR實用程序將返回匹配的線。您只需要一個批處理文件來捕獲行數並且get back錯誤給調用者(= MSBuild任務),並且構建失敗。

+0

不錯的想法,但請注意,部分類和繼承都會顛覆這一點,並且文件中的多個類會導致誤報。 只要您有權訪問編譯後的總代碼庫,就可以使用正確的FxCop規則。 – ShuggyCoUk 2009-04-21 23:09:22