什么是您已经完成或听说过的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