标签:基于 handle lin 关键字 集中 应用程序 IV .net 元数据
反射机制(Reflection)通常会涉及到3中场景:
System.Type 是反射模型中的最主要的抽象和入口点。它被用于描述两种相关但却不同的概念:基本信息(reference)和定义(definition),并使两者之间可以互操作。这使得其并不满足关注点分离(Separation of Concerns)设计原则。
从概念上讲,reference 是某种事物的浅显表述,而 definition 提供更丰富的表述。例如 System.Reflection.Assembly 类代表了程序集的 definitions,而System.Reflection.AssemblyName 类则代表了程序集的 references 。前者暴露了丰富的功能,而后者仅是提供能够获取定义的数据。
.NET 4.5 中包含了一些对传统反射机制的变更。其中最重要的变化是,System.Type 类被分割至两个独立的类中:Type 和 TypeInfo。TypeInfo 实例包含 Type 的定义,而 Type 则只关心数据。
如果你已经在基于 .NET 4.5 的桌面或者 Web 端应用程序中使用了反射机制,原有的 API 仍然可以使用,并且会与新的 API 共存,但新的 API 提供了更轻量级的实现。TypeInfo 使用 IEnumerable 泛型集合来构建元数据,而不是传统的数组。这使得 TypeInfo 可以支持使用 Lazy 方式遍历对象元数据,并且可以引入 LINQ 来使查询更加便捷。
我们先来看下使用传统 API 来检索 Type 元数据的方式。Type API 可以提供检索类型名称、名空间、类型全名称、所在模块等信息。API 结构与 .NET 4.0 中一致。
1 Type studentType = typeof(Student); 2 string studentAssembly = studentType.Assembly.FullName; 3 string studentFullName = studentType.FullName; 4 string studentNameSpace = studentType.Namespace; 5 string studentModule = studentType.Module.FullyQualifiedName;
正如你所看到的,Type 提供了对象结构的基本视图。如果你需要对类的结构挖掘的更新一些,现在可以使用新的 TypeInfo API。可以通过 GetTypeInfo() 方法从 Type 获取其 TypeInfo 定义。
我们先定义一个 Student 类:
1 public class Student 2 { 3 public string Name { get; set; } 4 public int Class { get; set; } 5 public int GetTestReport() { return 100; } 6 public event EventHandler Running; 7 }
现在,假如说你需要查看 Student 类中定义的属性、方法、事件等,可以通过 TypeInfo 提供的 API 获得。
1 TypeInfo studentInfo = studentType.GetTypeInfo(); 2 IEnumerable<PropertyInfo> declaredProperties = studentInfo.DeclaredProperties; 3 IEnumerable<MethodInfo> declaredMethods = studentInfo.DeclaredMethods; 4 IEnumerable<EventInfo> declaredEvents = studentInfo.DeclaredEvents;
另一个常见的反射方式是查找程序集内定义的所有类型。在 API 变化之后,Assembly.DefinedTypes 将返回一个 TypeInfo 的集合,而不是 Type 数组。
1 Assembly thisAssembly = typeof(Student).GetTypeInfo().Assembly; 2 IEnumerable<TypeInfo> allDefinedTypes = thisAssembly.DefinedTypes;
TypeInfo 除了提供上面描述的属性,还提供了若干用于获取元数据信息的方法。
标签:基于 handle lin 关键字 集中 应用程序 IV .net 元数据
原文地址:https://www.cnblogs.com/twinhead/p/9161489.html