下面是关于“C#中Attribute特性的用法”的完整攻略。
什么是Attribute?
Attribute是一种定义为类、方法、属性、字段、事件和委托等代码元素添加元数据的特殊语言结构,它们以中括号“[]”的形式表示。在运行时或编译时,可以通过反射机制获取被打上Attribute标记的代码元素的信息。
Attribute的分类
C#中的Attribute有两个基类:System.Attribute
和System.ComponentModel.Attribute
。前者定义了所有的自定义Attribute类型都必须继承的基类,它是所有Attribute类型的父类。后者则包含了在Windows窗体和Web窗体应用程序中常用的一些Attribute。
Attribute的常用特性
Obsolete
Obsolete属性用于指示某个成员已过时。Obsolete可以按两种方式使用,一种是只标记成员,一种是标记成员并提示错误。
例如下面的代码是标记成员而不提示错误:
[Obsolete("this method is deprecated, please use xxx method instead")]
public void OldMethod()
{
...
}
而下面的代码则是标记成员并提示错误:
[Obsolete("this method is deprecated, please use xxx method instead", true)]
public void OldMethod()
{
...
}
当把第二个参数(isError)设为true时,编译器会在代码中使用该成员时抛出错误。
DebuggerStepThrough
DebuggerStepThrough属性用于指示调试器在处理调试时跳过某个方法。这意味着调试器不会陷入到方法中,而是直接跳过它。
[DebuggerStepThrough]
public void MethodToSkipInDebug()
{
...
}
使用DebuggerStepThrough属性可以提高调试速度,特别是在调试大型代码库时。
Attribute的创建
可用以下步骤为类、方法、属性和参数等创建自定义Attribute。
- 使用AttributeUsageAttribute特性定义Attribute的用途。
- 定义Attribute类。
- 使用AttributeTarget属性定义Attribute适用于哪些代码元素。
- 添加Attribute构造函数和属性。
- 为Attribute设置默认值。
- 在代码中使用Attribute。
例如,我们可以定义自己的Attribute类,来标记某个方法已经过测试:
[AttributeUsage(AttributeTargets.Method)]
public class TestedAttribute : Attribute
{
private string _tester;
private DateTime _testDate;
public TestedAttribute(string tester, int year, int month, int day)
{
_tester = tester;
_testDate = new DateTime(year, month, day);
}
public string Tester
{
get { return _tester; }
}
public DateTime TestDate
{
get { return _testDate; }
}
}
然后,我们可以在某个测试过的方法上面使用该Attribute:
[Tested("John Smith", 2019, 1, 1)]
public void TestMethod()
{
...
}
Attribute的反射机制
当程序实例化一个对象时,Attribute的元数据将存储在对象的实例中。程序可以通过反射查询存储在对象中的Attribute的值。
例如,我们可以在下面的代码中查询TestMethod方法上声明的TestedAttribute:
MethodInfo method = typeof(MyClass).GetMethod("TestMethod");
foreach (TestedAttribute attr in method.GetCustomAttributes(typeof(TestedAttribute), false))
{
Console.WriteLine("Method tested by: {0}", attr.Tester);
Console.WriteLine("Test date: {0:d}\n", attr.TestDate);
}
这里,使用GetMethod
函数获取TestMethod对象的MethodInfo信息,然后使用GetCustomAttributes
函数来检索TestMethod上 的TestedAttribute。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中Attribute特性的用法 - Python技术站