您已经完成或听说过的CLR / C#代码中的自定义属性有哪些很酷的应用程序?标准属性的有趣新用法也是可以的!
编辑:由于Java的注释似乎与CLR的属性相同,因此使用Java注释也是有效的。
答案 0 :(得分:12)
[TypeDescriptionProvider]
,可用于提供自定义运行时属性模型 - 完全不同的属性,或者faster ones 一些经常被忽视的核心内容:
[TypeForwardedTo]
- 用于在不重新构建的情况下在程序集之间移动类型[PrincipalPermission]
- 用于自动强制执行成员安全答案 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) { }
}
详见:
答案 3 :(得分:2)
nunit当然
kent beck引用了属性的用法:NUnit 2.0是惯用设计的一个很好的例子。大多数移植xUnit的人只是音译Smalltalk或Java版本。这也是我们最初对NUnit所做的。这个新版本是NUnit,如果它在C#中完成它就会完成。
答案 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堆栈中。