2009-01-28 44 views
8

什麼是您已經完成或聽說過的CLR/C#代碼中自定義屬性的一些很酷的應用程序?標準屬性也有趣的新用途也可以!屬性或註釋的酷用途(CLR或Java)?

編輯:由於Java的註釋看起來與CLR的屬性相同,所以Java註釋的使用也是有效的。

回答

12

而且一些核心那些常常被忽視:

+0

該死的,你打我吧! – 2009-01-28 08:10:46

+0

爲PrincipalPermissionAttribute +1 - 我不能相信我以前手動做過。 – Botz3000 2009-06-05 13:36:25

8

雖然不是嚴格的C#,但我發現了Java註釋(= C#屬性)用於標記學生作業的有趣用法。每學期我爲學生編寫一個打標機器人,結果是一年級學生出於某種原因似乎無法精確地遵循指示,這當然會導致打標機器人失敗。所以我所做的是通過他們的代碼,找到所有不符合規範並修復它們的方法。然後我在每個錯誤的方法上加上註解(=屬性),告訴標記機器人標記它們。這可能是我認爲這樣做的最簡單直接的方法。

+0

儘管手動修復每個學生的代碼似乎並不簡單? – 2009-10-08 18:18:27

+0

的確如此,但在我們的案例中,這很簡單,因爲我們的政策是如果學生的作業沒有編譯,就沒有標記。所以我所做的只是刪除方法,並用一個存根替換它。 – 2009-10-09 02:48:51

1

我有一個案例,我想將界面的實際實現作爲數據展示。這當然可以通過反射來完成,但是通過對想要作爲數據公開的成員使用特定屬性,我可以封裝執行此操作所需的工作。

最終結果是我創建了我的實現,裝飾了所需的成員,然後我可以通過代碼和數據查詢成員,而無需在每種情況下都執行反射代碼。

1

有時,我使用屬性來裝飾類或方法,並使用反射來獲取「歸因」數據。

也許有點難以解釋,但我已經使用屬性的最後一件事是在一個系統中,我有一個數據庫中的幾個實體。

每個實體都有某種'代碼',每個實體也可以有一些解釋規則。

在我的項目中,我有一個實體類,它表示一個存在於數據庫中的實體,並且我還有一組「規則」類。 One Rule類包含給定實體的解釋邏輯。

爲了將某個「規則」(解釋)「鏈接」到我的實體的特定實例,我創建了一個自定義屬性。

我用這個屬性來修飾我的'規則'類,並通過屬性來定義這是一個規則的實體。 然後,當我從DB加載實體時,我將正確的規則注入到該實體中。

的代碼一點點地把事情說清楚:

public class MyEntity 
{ 
    public string Code 
    { 
     get; 
     private set; 
    } 

    public bool IsValidFor(...) 
    { 
     IRule rule = RuleRegistry.GetRuleFor(this); 

     if(rule.IsValid()) ... 
    } 

} 

[RuleAttrib("100")] 
public class MyRule : IRule 
{ 
    public bool IsValid() 
    { 
    } 
} 

這只是一個小例子,但我認爲你會趕上漂移。

MyRule類的RuleAttrib屬性表示這是一個應該應用於具有代碼「100」的MyClass實例的規則。

RuleRegistry實例能夠檢索當前實體的正確IRule(使用反射)。

在我使用的屬性,與Postsharp組合的另一個例子,是一個「鎖定」制度的實施: http://fgheysels.blogspot.com/2008/08/locking-system-with-aspect-oriented.html

1

我們使用自定義的Java標註來標記的某些方法特殊用途,大多是有針對性的在開發商:

  • @ScriptingAPI - 公開爲我們的腳本API的一部分標記代碼(警告說,變化可能會影響到公共API開發人員)
  • @Transaction - 在T標記方法他是開始/提交事務的數據庫外觀(我們有一個尊重此註釋的專用事務處理程序類)
  • @NeedsAttentionToSupportFoo - 如果我們知道Foo特性是我們需要在不久的將來需要解決的需求,使用註解來標記我們需要觸及以支持它的代碼,也就是說,當我們遇到一段讓我們想到「啊,這將需要改變以支持Foo」的代碼時,我們會對它進行註釋。如果Foo的實現被推遲或永遠不會發生,那麼移除註釋比恢復代碼中四處散佈的早熟優化更容易。

this java specialist newsletter中介紹了自定義註釋的另一個很好的示例用法:在所有子類中強制執行公共無參數構造函數。

3

檢出xUnit並查看如何使用屬性標記單元測試的預期行爲以及將數據輸入測試。屬性以比MSTest或NUnit更有意義的方式使用。

Samples\TestMethodExtensibility\Example.cs

public class Example 
{ 
    static int val; 

    [RepeatTest(5, Timeout=250)] 
    public void RepeatingTestMethod() 
    { 
     Thread.Sleep(100); 
     Assert.Equal(2, 2); 

     if (val == 0) 
     { 
      val++; 
      Thread.Sleep(1000); 
     } 
    } 
} 

test.xunit.extensions\DataTheories\TheoryAttributeTests.cs

internal class TestMethodCommandClass 
{ 
    public static IEnumerable<object[]> EmptyData 
    { 
     get { return new object[0][]; } 
    } 

    public static IEnumerable<object[]> NullData 
    { 
     get { return null; } 
    } 

    public static IEnumerable<object[]> TheoryDataProperty 
    { 
     get { yield return new object[] { 2 }; } 
    } 

    [Theory, PropertyData("EmptyData")] 
    public void EmptyDataTheory() { } 

    [Theory, PropertyData("NullData")] 
    public void NullDataTheory() { } 

    [Theory, OleDbData(
     @"Provider=Microsoft.Jet.OleDb.4.0; Data Source=DataTheories\UnitTestData.xls; Extended Properties=Excel 8.0", 
     "SELECT x, y, z FROM Data")] 
    public void TestViaOleDb(double x, 
          string y, 
          string z) { } 

    [Theory, PropertyData("TheoryDataProperty")] 
    public void TestViaProperty(int x) { } 

    [Theory, ExcelData(@"DataTheories\UnitTestData.xls", "SELECT x, y, z FROM Data")] 
    public void TestViaXls(double x, 
          string y, 
          string z) { } 

} 

有關詳細信息,請參閱:

http://www.codeplex.com/xunit

2

當然NUnit的

屬性的用法一直引以爲豪:

NUnit 2.0是一個很好的慣例設計的例子。大多數移植xUnit的人只是音譯Smalltalk或Java版本。這就是我們最初對NUnit所做的。這個新版本是NUnit,因爲如果它是在C#中完成的,它將會完成。

來源:http://www.nunit.org/

1

城堡的ActiveRecord使用屬性。它通過使用指示應該保存到數據庫的類和字段的屬性(以及如何)來修飾Model對象來隱藏NHibernate的一些設置複雜性。驗證組件中還使用屬性來將基於模型的驗證添加到ActiveRecord和堆棧中。