知识大全 对.NET Framework 反射的反思[4]

Posted 类型

篇首语:别总是羡慕别人光芒万丈,却忘了自己也会发光。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 对.NET Framework 反射的反思[4]相关的知识,希望对你有一定的参考价值。

对.NET Framework 反射的反思[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  如果事先完全了解需要转换的正式数据类型(例如自己编写代码时) 事情就变得非常简单 foreach(Address a in AddressList) Console WriteLine( Address: a ID); Console WriteLine( \\tStreet: a Street);  // and so on  然而 如果预先不知道在运行时会遇到的数据类型 情况会变得十分有趣 您如何编写象这样的一般框架代码?  MyFramework TranslateObject(object input MyOutputWriter output)  首先 您需要决定哪些类型成员对序列化有用 可能的情况包括仅捕获特定类型的成员 例如基元系统类型 或提供一种机制以供类型作者说明哪些成员需要被序列化 例如在类型成员上使用自定义属性作为标记) 您仅可以捕获特定类型的成员 例如基元系统类型 或类型作者能够说明哪些成员需要被序列化(可能的方法是在类型成员上使用自定义属性作为标记)   一旦记录清楚需要转换的数据结构成员 您接着需要做的是编写逻辑 从传入的对象枚举和检索它们 反射在这里担负了繁重的任务 让您既可以查询数据结构又可以查询数据值   出于简单性考虑 我们来设计一个轻型转换引擎 得到一个对象 获取所有其公共属性值 通过直接调用 ToString 将它们转换成字符串 然后将这些值序列化 对于一个名为 input 的给定对象 算法大致如下   调用 input GetType 以检索 System Type 实例 该实例描述了 input 的底层结构   用 Type GetProperties 和适当的 BindingFlags 参数 将公共属性作为 PropertyInfo 实例检索   使用 PropertyInfo Name 和 PropertyInfo GetValue 将属性作为键 值对检索   在每个值上调用 Object ToString 将其(通过基本方式)转化为字符串格式   将对象类型的名称和属性名称 字符串值的集合打包成正确的序列化格式   这一算法明显简化了事情 同时也抓住了得到运行时数据结构 并将其转化为自描述型数据的要旨 但这里有一个问题 性能 之前提到 反射对于类型处理和值检索的成本都很高 本示例中 我在每个提供类型的实例中执行了完整的类型分析   如果以某种方式可以捕获或保留您对于类型结构的理解 以便日后不费力地检索它 并有效处理该类型的新实例;换句话说 就是往前跳到示例算法中的步骤 # ?好消息是 利用 NET Framework 中的功能 完全可能做到这一点 一旦您理解了类型的数据结构 便可以使用 CodeDom 动态生成绑定到该数据结构的代码 您可以生成一个帮助器程序集 其中包含帮助器类和引用了传入类型并直接访问其属性的方法(类似托管代码中的任何其他属性) 因此类型检查只会对性能产生一次影响   现在我将修正这一算法 新类型   获得对应于该类型的 System Type 实例   使用各种 System Type 访问器检索架构(或至少检索对序列化有用的架构子集) 例如属性名称 字段名称等   使用架构信息生成帮助器程序集(通过 CodeDom) 该程序集与新类型相链接 并有效地处理实例   在帮助器程序集中使用代码 提取实例数据   根据需要序列化数据   对于给定类型的所有传入数据 可以往前跳到步骤 # 较之显式检查每一实例 这么做可以获得巨大的性能提升   我开发了一个名为 SimpleSerialization 的基本序列化库 它用反射和 CodeDom(本专栏中可下载)实现了这一算法 主要组件是一个名为 SimpleSerializer 的类 是用户用一个 System Type 实例构造所得 在构造函数中 新的 SimpleSerializer 实例会分析给定的类型 利用帮助器类生成一个临时程序集 该帮助器类会紧密绑定到给定的数据类型 而且对实例的处理方式就象自己在完全事先了解类型的情况下编写代码那样   SimpleSerializer 类有如下布局 class SimpleSerializer public class SimpleSerializer(Type dataType); public void Serialize(object input SimpleDataWriter writer);  简单地令人惊叹!构造函数承担了最繁重的任务 它使用反射来分析类型结构 然后用 CodeDom 生成帮助器程序集 SimpleDataWriter 类只是用来阐明常见序列化模式的数据接收器   要序列化一个简单的 Address 类实例 用下面的伪代码即可完成任务   SimpleSerializer mySerializer = new SimpleSerializer(typeof(Address));  SimpleDataWriter writer = new SimpleDataWriter();  mySerializer Serialize(addressInstance writer);   结束  强烈建议您亲自试用一下示例代码 尤其是 SimpleSerialization 库 我在 SimpleSerializer 一些有趣的部分都添加了注释 希望能够有所帮助 当然 如果您需要在产品代码中进行严格的序列化 那么确实要依靠 NET Framework 中提供的技术(例如 XmlSerializer) 但如果您发现在运行时需要使用任意类型并能高效处理它们 我希望您采用我的 SimpleSerialization 库作为自己的方案 cha138/Article/program/net/201311/15773

相关参考

知识大全 对.NET Framework 反射的反思[1]

对.NETFramework反射的反思[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  清晰

知识大全 对.NET Framework 反射的反思[3]

对.NETFramework反射的反思[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  动态

知识大全 .Net Framework 2.0范型的反射使用

.NetFramework2.0范型的反射使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在

知识大全 .Net Framework 2.0范型的反射使用[1]

.NetFramework2.0范型的反射使用[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 .Net Framework 2.0范型的反射使用[2]

.NetFramework2.0范型的反射使用[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 .Net Framework 2.0范型的反射使用[3]

.NetFramework2.0范型的反射使用[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 .NET Framework 4并行编程的现在

.NETFramework4并行编程的现在  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  让我们

知识大全 .NET Framework 4新增LocalDB支持

微软:.NETFramework4新增LocalDB支持  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 .NET Framework 4.5新特性介绍

.NETFramework4.5新特性介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    开

知识大全 ADO.NET Entity Framework 试水——并发[4]

ADO.NETEntityFramework试水——并发[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来