C# Attribute 解析与应用
Attribute是什么(定义)
Attributes provide a powerful method of associating metadata, or declarative information, with code (assemblies, types, methods, properties, and so forth). After an attribute is associated with a program entity, the attribute can be queried at run time by using a technique called reflection.
上面这段是微软官方文档给出的定义,看不懂也没关系。
用我理解简单地描述一下(用人话说)Attribute其实就是被添加进代码的注释。你只要知道Attribute这个东西本质就是一个注释,只是这个注释加进来代码里。那为什么要把注释加进代码里呢?目的就是为了当这个方法被调用的时候,可以根据这个方法的Attribute来进行决策如何调用这个方法
Attribute是作用
Attribute的作用是为元数据添加内容。
元数据可以被工具支持,比如:编译器用元数据来辅助编译,调试器用元数据来调试程序。
Attribute详细解释
举个例子
public class A : Person
{
[PersonAttribute(Name="JOJO")]
public void do_human()
{
Console.WriteLine("Do Human");
}
}
public class B : Person
{
[PersonAttribute(Name="DIO")]
public void do_human()
{
Console.WriteLine("Do not Human");
}
}
public class C : Person
{
[PersonAttribute(Name="KAQY")]
public void do_human()
{
Console.WriteLine("Do Human");
}
}
现在有一个需求,需要处理从外部传来的一个Person集合,这里面有一个B,但是我不想让这个B执行do_human
,那咋办,首先可以通过is进行一个一个的判断,但是当Person的子类很多的时候,这样写的代码无疑是冗杂的。而且C我想让他执行do_human
的时候额外做其他事怎么办,难道我又要一个一个判断吗?(这里设想的例子比较简单,懂我意思即可,就是处理复杂情况下,可以直接根据Attribute
来进行决策)
这个时候就可以使用Attribute
来进行判断,如果Name是DIO就不让执行,如果是JOJO就让其执行,当其为KQY的时候可以直接让其做其他的事。
这里所有的切都发生在这个do_human
这个方法被调用之前,来根据属性进行决策判断。可以从这里我略窥c#中设计Attribute
的目的,目的就是为了在反射的时候更智能的进行决策
Attribute格式
在使用Attribute的时候,有“长记法”和“短记法”两种
//长记法
[PersonAttribute(Name="DIO")]
public void do_human()
{
Console.WriteLine("Do not Human");
}
//短记法
[Person(Name="JOJO")]
public void do_human()
{
Console.WriteLine("Do Human");
}
Conditional
这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。
它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace。例如,当调试代码时显示变量的值。
规定该特性的语法如下:
#define DEBUG
using System;
using System.Diagnostics;
public class Myclass
{
[Conditional("DEBUG")]
public static void Message(string msg)
{
Console.WriteLine(msg);
}
}
class Test
{
static void function1()
{
Myclass.Message("In Function 1.");
function2();
}
static void function2()
{
Myclass.Message("In Function 2.");
}
public static void Main()
{
Myclass.Message("In Main function.");
function1();
Console.ReadKey();
}
}
当上面的代码被编译和执行时,它会产生下列结果:
In Main function
In Function 1
In Function 2
当把第一行改成#define RELEASE则不会打印显示