2008-11-24 75 views
9

在C#中編寫自定義屬性時,我想知道是否有任何有關屬性例外的指導方針或最佳做法。 該屬性應該檢查給定參數的有效性嗎?或者這是財產使用者的任務?自定義屬性和例外.net

在一個簡單的測試中,我沒有拋出異常,直到我對帶有異常拋出屬性的類型使用GetCustomAttributes爲止。 我只是覺得從一個屬性中只有在明確要求它們時纔會得到一個異常是有點尷尬的。


例,出現異常屬性:

[AttributeUsage(AttributeTargets.Interface, AllowMultiple = false, Inherited = false)] 
sealed public class MyAttribute : Attribute 
{ 
    public string SomeValue { get; private set; } 

    public MyAttribute(string someValue) 
    { 
     if(string.IsNullOrEmpty(someValue)) 
     { 
      throw new ArgumentNullException("path"); 
     } 

     if(!someOtherCheck(someValue)) 
     { 
      throw MyAttributeException("An other error occured"); 
     } 

     SomeValue = someValue; 
    } 
} 

回答

7

屬性,當您使用反射僅是實際構成的,所以這就是你可以拋出一個異常,唯一的一次。我不記得曾用使用一個屬性,並讓它拋出異常。屬性通常提供數據而不是真實行爲 - 我期望代碼使用屬性提供任何驗證。我知道這不像普通的封裝,但它是我的經驗。

1

我們在項目中有一些相當複雜的屬性,所以我們包含輸入的驗證。例如,作爲我們的I18N和L10N工作的一部分,我們擁有執行資源查找的屬性(非常類似於用於本地化設計器中屬性的類別和描述字符串的框架中的屬性)。這些自定義屬性必須進行一些驗證才能使其工作。

我們使用的簡單屬性沒有驗證,因爲我們寧願使用代碼失敗,指出錯誤的位置。

因此,總而言之,它確實取決於屬性的複雜性;如果它是用一種數據實例化的,但希望提供另一種數據(比如在資源查找中),它應該包含驗證,否則它可能不應該。

2

除了編譯器特定的含義(例如[PrincipalPermission]等)外,屬性不能直接與代碼進行交互而不會被要求。但是,如果您使用AOP(面向方面​​編程)工具「PostSharp」,則您的方面屬性可以將行爲添加到您的類中。不簡單,但有時候這是一個非常有用的技巧。