要读取特性的值,我们必须使用一种称为“反射(reflection)”的技术。这种非常高级的技术让我们可以在运行的时候动态检査类型信息,甚至是在创建对象的位置,或者在不必知道具体对象的情况下直接调用某个方法。在使用特性之前,需要了解该技术的一些基本知识。有关该技术的更多信息,可以访问 https://docs.microsoft.com/eii-us/dotnet/framework/reflection-and-codedom/reflection。
简单来说,反射可以取得保存在Type对象(本书中会多次提到该对象)中的使用信息,以及通过System.Reflection名称空间中的各种类型来获取不同的类型信息。在此之前,我们己经了解过通过typeof运算符从类中快速获取类型信息,以及使用GetType()方法从对象实例中获取信息的方法。通过反射技术,我们可继续从Type对象取得成员信息。基于这个方法,我们就可以从类或类的不同成员中取得特性信息了。
为此,最简单的方法即通过Type.GetCustomAttributes()方法来实现。这个方法最多使用两个参数,然后返回一个包含一系列object实例的数组,每个实例都是一个特性实例。第一个参数是可选的,即传递我们感兴趣的类型或若干特性的类型(其他所有特性均会被忽略)。如果不使用这—参数,将返回所有特性。第二个参数是必需的,即通过一个布尔值来指示,只想了解类本身的信息,还是除了该类之外还希望了解派生自该类的所有类。
例如,下面的代码可以列出DecoratedClass类的特性:
Type classType = typeof(DecoratedClass);
object[] customAttributes = classType.GetCustomAttributes(true);
foreach (object customAttribute in customAttributes)
{
WriteLine($"Attribute of type {customAttribute} found.");
}
通过这种方法了解到不同的特性后,我们就可以为不同的特性采取不同的操作了。这也正是当Visual Studio遇到前面介绍的DebuggerStepThroughAttribute特性时所执行的操作。
已有 22658 名学员学习以下课程通过考试
最需教育客户端 软件问题一手掌握
去 App Store 免费下载 iOS 客户端
点击加载更多评论>>