2009-01-28 42 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和堆栈中。