在现实世界中,您使用了哪些自定义.NET属性?
我已经阅读了几篇关于它们的文章,但我从未使用过自定义属性。
我觉得当它们有用时我可能会忽略它们。
我说的是你创建的属性,而不是已经包含在框架中的属性。
答案 0 :(得分:5)
我创建了一个脚本引擎,并使用[Command]属性标记了各种方法。这意味着这些函数暴露给脚本引擎。
示例:
[Command(HelpText = "Lists active users")]
void ListUsers(void)
{
}
[Command(HelpText = "Terminate a specific user's connection")]
void EndConnection(int userID)
{
}
使用时:
MyScriptEngine>> Help
Available Commands are:
ListUsers: Lists active users
EndConnection {userID}: Terminate a specific user's connection
MyScriptEngine>> EndConnection 3
User 3 (Michael) has had his connection terminated.
MyScriptEngine>>
答案 1 :(得分:4)
我已经使用它们“自定义”属性进行验证(即用我自己的“信用卡验证”标记要验证的字段)和我编写的自定义LinqToLucene分析器(即指定要在哪个上使用的分析器)给定的领域)。
例如,验证码看起来像这样:
public class Customer
{
[CreditCardValidator]
string creditCardNumber;
[AddressValidator]
string addressLineOne
}
当验证上述对象时,由于“自定义”属性,每个字段都使用适当的验证器进行验证。
在LinqToLucene中,我编写的自定义属性很好,因为它们允许您在运行时查找(通过反射)特定字段。例如,如果您有一个客户对象,您可能有兴趣获取所有已标记为“索引我”的属性:自定义属性可让您轻松完成此操作,因为它以某种方式公开有关对象的元数据很容易查询。
答案 2 :(得分:1)
除此之外,我还使用它们来指定在运行时读取的EBNF,以便动态创建自定义解析器,还可以指定有关数据库字段的元数据。
我发现一个'模式'我通常使用自定义属性来替换枚举,尤其是当代码中的diff位置依赖于枚举时。
E.g。我可能有一个对象状态的枚举。基于这种状态,我在代码中可能有3或4个不同的位置,我会对该枚举进行“切换”并执行一些操作。其他一些开发人员可以通过添加新的枚举来轻松引入错误,但不能在代码中的其他地方处理其中一个switch语句。
为了避免这种情况,我创建了一个声明为静态类的自定义属性。自定义属性在类的静态构造函数中加载到字典中,代码中的所有位置都使用字典而不是switch语句。自定义属性构造函数包含每个switch语句的“硬编码”值。
答案 3 :(得分:0)
我不得不将一些对象序列化为自定义(遗留)格式,并且我使用属性来识别应该序列化哪些字段以及如何格式化它们。然后我有了一个序列化器,可以使用这些属性的任何对象,并使用反射来格式化它。
答案 4 :(得分:0)
我在其中一个基于ActiveRecord模式开发的ORM框架中使用过它。这与LINQ,Castle项目等中可用的实现相同。
该框架被称为“SkyFramework”,但它不是开源的。
例如只是一个粗略的例子......
您也可以在其他开源项目中找到类似的示例。
[Sky.Table ("user")]
public class User
{
[Sky.Column ("username")]
public string UserName;
[Sky.Column ("pwd")]
public string Password;
}
[Sky.Table ("user")]
public class User
{
[Sky.Column ("username")]
public string UserName;
[Sky.Column ("pwd")]
public string Password;
}
注意:属性“Table”,“Columns”是当时的自定义属性。
ActiveRecord引擎解析对象以获取这些属性,并为CRUD ...等生成相应的函数。
同样,我开发了一些自定义属性来识别需要进行基准测试的代码部分...例如...
标有上述属性的方法会自动进行基准测试,并生成日志。这些是早期的一些实现。
有一篇关于这个主题的Apress书籍。 Applied .NET Attribues这可能对你有所帮助。
答案 5 :(得分:0)
我还没有真正找到自定义属性的用途。有一些情况我认为它们可能是合适的但没有使用它们,因为显然阅读自定义属性所涉及的反映非常昂贵。
答案 6 :(得分:0)
我在“插件”DLL中的类上放置了自定义属性。这允许框架动态发现可用的插件,评估它们是否感兴趣,然后动态加载感兴趣的插件。
在我们的域中,示例是插件,用于模拟一个系列中的特定车辆。用于车辆系列的一个插件实际上可以模拟车辆系列内的若干车辆模型(例如,“MX-6”,“探测器”)。如果包含ID或模型名称作为自定义属性数组,我们可以快速忽略任何甚至没有自定义属性的DLL,然后进一步忽略任何不模拟感兴趣的车辆的。