很好地使用属性或注释(CLR或Java)?

时间:2009-01-28 07:57:00

标签: c# java attributes annotations

您已经完成或听说过的CLR / C#代码中的自定义属性有哪些很酷的应用程序?标准属性的有趣新用法也是可以的!

编辑:由于Java的注释似乎与CLR的属性相同,因此使用Java注释也是有效的。

8 个答案:

答案 0 :(得分:12)

一些经常被忽视的核心内容:

答案 1 :(得分:8)

虽然不是严格的C#,但我发现了Java注释(= C#属性)用于标记学生作业的有趣用法。每个学期我都会为学生编写一个标记机器人,事实证明,由于某种原因,一年级学生似乎无法准确地遵循指令,这当然会导致标记机器人失败。所以我所做的就是浏览他们的代码,找到所有不符合规范的方法并修复它们。然后我将一个注释(=属性)放到每个错误的方法上,告诉标记机器人将它们标记下来。我认为这可能是最简单直接的做法。

答案 2 :(得分: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

答案 3 :(得分:2)

nunit当然

kent beck引用了属性的用法:

NUnit 2.0是惯用设计的一个很好的例子。大多数移植xUnit的人只是音译Smalltalk或Java版本。这也是我们最初对NUnit所做的。这个新版本是NUnit,如果它在C#中完成它就会完成。

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

答案 4 :(得分:1)

我有一个案例,我想将接口的实际实现呈现为数据。这可以通过反射来完成,但是通过使用我希望作为数据公开的成员的特定属性,我可以封装执行此操作所需的工作。

最终结果是我创建了我的实现,装饰了所需的成员,然后我可以通过代码和数据查询成员,而不必在每种情况下都使用Reflection代码。

答案 5 :(得分:1)

有时,我使用属性来装饰类或方法,并使用反射来获取“属性”数据。

可能有点难以解释,但我使用属性的最后一件事是在一个系统中,我在数据库中有几个实体。

每个实体都有某种“代码”,每个实体也可以有一些解释规则。

在我的项目中,我有一个实体类,它代表一个存在于数据库中的实体,而且,我还有一组“规则”类。 一个Rule类包含给定实体的解释逻辑。

为了将某个“规则”(解释)“链接”到我的实体的特定实例,我创建了一个自定义属性。

我用这个属性装饰我的'Rule'类,通过该属性,我定义了哪个实体这是一个规则。 然后,当我从数据库加载实体时,我将正确的规则注入该实体。

一些简单明了的代码:

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

答案 6 :(得分:1)

我们使用自定义java注释来标记某些方法的特殊用途,主要针对开发人员:

  • @ScriptingAPI - 标记作为脚本API一部分公开的代码(警告开发人员更改可能会影响公共API)
  • @Transaction - 在数据库外观上标记正在启动/提交事务的方法(我们有一个尊重此注释的专用事务处理程序类)
  • @NeedsAttentionToSupportFoo - 如果我们知道功能Foo是我们需要在不久的将来解决的要求,我们使用注释来标记我们需要触摸以支持它的代码,即当我们遇到一段代码,让我们想到“啊,这需要改变以支持Foo”,我们注释它。如果Foo的实现被推迟或永远不会发生,那么删除注释比恢复分散在代码中的早熟优化更容易。

this java specialist newsletter中介绍了自定义注释的另一个好例子用法:在所有子类中强制执行public no-args构造函数。

答案 7 :(得分:1)

Castle ActiveRecord使用属性。它通过使用指示应该持久保存到数据库的类和字段的属性(以及如何)来修饰您的Model对象,从而隐藏了NHibernate的一些设置复杂性。验证组件中还使用属性将基于模型的验证添加到ActiveRecord和Monorail堆栈中。