zoukankan      html  css  js  c++  java
  • FluorineFx ASObject自动转换基础类 AutoParseASObject ,用于Flash AMF协议解析

    在做AMF协议应用时会遇到一个数据转换问题,也就是从ASObject转换成.NET的类

    如:热血三国中的战场信息

      

    转换为.NET中战场信息类

    诸如此类的类型转换,可以利用AutoParseASObject来做为基础类进行自动解析,使用此基础类前先定义好相对应的数据库,类中FieldProperty名称必需与转换对象一至(有兴趣的朋友可以自己加类型属性,这样就更为灵活)

    下面是AutoParseASObject代码,当然除了AMF数据对象转换也可以应用于其他数据转换过程中,如数据库结构类,JSON数据等的处理,

    原理是利用Type来自动创建实例对象,并将相关数据值自动进行类型转换,得到一个新的实例,

    有人或许会想,是否可以动态创建一个数据类呢,这个是完全可以实现的,利用.NET的动态编译完全可以做到,具体怎么实现我就不写了,应该更为简单.

    代码实现:(郁闷发布那个插入代码用起来好不爽....=.=还是直接帖一下得了)

    public class AutoParseASObject<T>

    {

        public static T Parse(ASObject pObj)

        {

            try

            {

                Type tmpType = typeof(T);

                T tmpRstObj = (T)Activator.CreateInstance(tmpType);

                MemberInfo[] tmpMembers = tmpType.GetMembers();

                for (int i = 0; i < tmpMembers.Length; i++)

                {

                    var tmpVar = from value in pObj

                                 where value.Key.ToLower() == tmpMembers[i].Name.ToLower()

                                 select value.Value;

                    using (IEnumerator<object> tmpEnum = tmpVar.GetEnumerator())

                        if (tmpEnum.MoveNext())

                        {

     

                            switch (tmpMembers[i].MemberType)

                            {

                                case MemberTypes.Field:

                                    tmpType.GetField(tmpMembers[i].Name).SetValue(tmpRstObj, Convert.ChangeType(tmpEnum.Current, tmpType.GetField(tmpMembers[i].Name).FieldType));

                                    break;

                                case MemberTypes.Property:

                                    if (tmpType.GetProperty(tmpMembers[i].Name).CanWrite)

                                        tmpType.GetProperty(tmpMembers[i].Name).SetValue(tmpRstObj, Convert.ChangeType(tmpEnum.Current, tmpType.GetProperty(tmpMembers[i].Name).PropertyType), null);

                                    break;

                            }

                        }

                }

                return tmpRstObj;

            }

            catch { return default(T); }

        }

    }

  • 相关阅读:
    软件工程(2019)第一次作业
    Coding.net主页地址链接
    解决Oracle 11g重建em时报错创建档案资料库时出错以及删除原有em时报监听程序未启动
    解决VirtualBox与锐捷网络冲突的问题
    王道数据结构复习(一)
    第二次结对编程—四则运算自动生成程序
    软件工程(2019)结对编程第一次作业
    软件工程(2019)第三次个人作业——求最大子段和(于VS2017下代码覆盖单元测试)
    软件工程(2019)第二次作业
    软件工程第一次作业
  • 原文地址:https://www.cnblogs.com/pvistely/p/1445772.html
Copyright © 2011-2022 走看看