Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么要使用';自定义属性';在您的代码(.NET)中_C#_.net_Attributes - Fatal编程技术网

C# 为什么要使用';自定义属性';在您的代码(.NET)中

C# 为什么要使用';自定义属性';在您的代码(.NET)中,c#,.net,attributes,C#,.net,Attributes,有人能解释一下在代码中使用自定义属性的好处(或原因)吗。当然,我在某些场景(WCF、序列化等)中使用(并理解)定义的属性,但我无法想象我需要创建和使用自己的自定义属性的任何算法。有人能提供一个真实的例子,在这个例子中,自定义属性的使用给项目带来了一些东西。如果您想编写自己的系统,如WCF、序列化等 如果您编写的代码对类型或成员进行迭代并对其执行操作,则通常需要使用自己的自定义属性将某些成员标记为不同或特殊的成员。它们可用于标记测试,例如在MBUnit中。它们还可以用于检查和加载类(如插件系统)以

有人能解释一下在代码中使用自定义属性的好处(或原因)吗。当然,我在某些场景(WCF、序列化等)中使用(并理解)定义的属性,但我无法想象我需要创建和使用自己的自定义属性的任何算法。有人能提供一个真实的例子,在这个例子中,自定义属性的使用给项目带来了一些东西。

如果您想编写自己的系统,如WCF、序列化等


如果您编写的代码对类型或成员进行迭代并对其执行操作,则通常需要使用自己的自定义属性将某些成员标记为不同或特殊的成员。

它们可用于标记测试,例如在MBUnit中。它们还可以用于检查和加载类(如插件系统)以提供元信息的代码

与WCF等的原因相同,但这是特定于您的项目的原因-您希望向某些成员(类型、字段、方法等)添加一些元数据,以指定有关所涉及的机制的内容,而这些内容不是现有属性所涵盖的内容

例如,NUnit想添加他们自己的指示,表明某个特定类型包含单元测试——没有这样的现有属性,所以他们创建了
TestFixtureAttribute


当然,这是一个相对罕见的事件,但它是可以发生的。

自定义验证是一个非常好的用例,可以从以下链接看到:


我经常使用自定义的.Net属性来支持我的基础结构中的工具。一个例子来自.Net时代的早期(确切地说是C#1.0)。我正在做一个研究项目,它有一个C++的前端,一个全新的C语言后端。p> 前端和后端共享一个非常相似的对象模型,该模型发展非常迅速。我不想手工编写C++前端模型、C++序列化机制和C系列序列化机制,而是选择用自定义属性来命名我的C类型。他们告诉我模型的前端和后端共享的部分

一旦这些属性就位,我就编写了一个快速而肮脏的工具

  • 解析属性以构建核心共享模型
  • 生成了C#序列化代码
  • < LI>生成C++代码 < LI>生成C++序列化代码< /LI>

这使得在我的两个项目之间保持我的模型最新变得非常简单。只需更改C代码,编译并重新运行我的工具

我在不久前开发的自定义AOP(面向方面编程)系统中使用了注释。属性对于控制正交关注点(如代码生成)也非常有用。

为您提供一个我使用它们的具体案例。我曾经不得不与大型机屏幕清理器进行交互。我创建了一个自定义属性来注释我想从类发送到大型机的字段、超出约定的名称、处理格式和集合的特殊规则。然后我有了一个类,它能够反映实例,并意识到需要哪些字段子集来与大型机屏幕刮板进行适当的交互

它们在构建对象映射器/ORM工具时也非常有用。如果您决定推出自己的映射系统,那么它们几乎是获得所需功能的“必需”。它更多地用于使方法/类更通用,并使用反射来确定如何处理对象/选择对象等