什麼是您已經完成或聽說過的CLR/C#代碼中自定義屬性的一些很酷的應用程序?標準屬性也有趣的新用途也可以!屬性或註釋的酷用途(CLR或Java)?
編輯:由於Java的註釋看起來與CLR的屬性相同,所以Java註釋的使用也是有效的。
什麼是您已經完成或聽說過的CLR/C#代碼中自定義屬性的一些很酷的應用程序?標準屬性也有趣的新用途也可以!屬性或註釋的酷用途(CLR或Java)?
編輯:由於Java的註釋看起來與CLR的屬性相同,所以Java註釋的使用也是有效的。
[TypeDescriptionProvider]
可用於提供自定義運行時屬性模型 - 無論是完全不同的特性,或者faster ones而且一些核心那些常常被忽視:
[TypeForwardedTo]
- 用於移動組件之間的類型無需重新構建[PrincipalPermission]
- 用於自動執行成員安全雖然不是嚴格的C#,但我發現了Java註釋(= C#屬性)用於標記學生作業的有趣用法。每學期我爲學生編寫一個打標機器人,結果是一年級學生出於某種原因似乎無法精確地遵循指示,這當然會導致打標機器人失敗。所以我所做的是通過他們的代碼,找到所有不符合規範並修復它們的方法。然後我在每個錯誤的方法上加上註解(=屬性),告訴標記機器人標記它們。這可能是我認爲這樣做的最簡單直接的方法。
儘管手動修復每個學生的代碼似乎並不簡單? – 2009-10-08 18:18:27
的確如此,但在我們的案例中,這很簡單,因爲我們的政策是如果學生的作業沒有編譯,就沒有標記。所以我所做的只是刪除方法,並用一個存根替換它。 – 2009-10-09 02:48:51
我有一個案例,我想將界面的實際實現作爲數據展示。這當然可以通過反射來完成,但是通過對想要作爲數據公開的成員使用特定屬性,我可以封裝執行此操作所需的工作。
最終結果是我創建了我的實現,裝飾了所需的成員,然後我可以通過代碼和數據查詢成員,而無需在每種情況下都執行反射代碼。
有時,我使用屬性來裝飾類或方法,並使用反射來獲取「歸因」數據。
也許有點難以解釋,但我已經使用屬性的最後一件事是在一個系統中,我有一個數據庫中的幾個實體。
每個實體都有某種'代碼',每個實體也可以有一些解釋規則。
在我的項目中,我有一個實體類,它表示一個存在於數據庫中的實體,並且我還有一組「規則」類。 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
我們使用自定義的Java標註來標記的某些方法特殊用途,大多是有針對性的在開發商:
@ScriptingAPI
- 公開爲我們的腳本API的一部分標記代碼(警告說,變化可能會影響到公共API開發人員)@Transaction
- 在T標記方法他是開始/提交事務的數據庫外觀(我們有一個尊重此註釋的專用事務處理程序類)@NeedsAttentionToSupportFoo
- 如果我們知道Foo特性是我們需要在不久的將來需要解決的需求,使用註解來標記我們需要觸及以支持它的代碼,也就是說,當我們遇到一段讓我們想到「啊,這將需要改變以支持Foo」的代碼時,我們會對它進行註釋。如果Foo的實現被推遲或永遠不會發生,那麼移除註釋比恢復代碼中四處散佈的早熟優化更容易。在this java specialist newsletter中介紹了自定義註釋的另一個很好的示例用法:在所有子類中強制執行公共無參數構造函數。
檢出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) { }
}
有關詳細信息,請參閱:
當然NUnit的
屬性的用法一直引以爲豪:
NUnit 2.0是一個很好的慣例設計的例子。大多數移植xUnit的人只是音譯Smalltalk或Java版本。這就是我們最初對NUnit所做的。這個新版本是NUnit,因爲如果它是在C#中完成的,它將會完成。
城堡的ActiveRecord使用屬性。它通過使用指示應該保存到數據庫的類和字段的屬性(以及如何)來修飾Model對象來隱藏NHibernate的一些設置複雜性。驗證組件中還使用屬性來將基於模型的驗證添加到ActiveRecord和堆棧中。
該死的,你打我吧! – 2009-01-28 08:10:46
爲PrincipalPermissionAttribute +1 - 我不能相信我以前手動做過。 – Botz3000 2009-06-05 13:36:25