当前位置:主页   - 电脑 - 网站开发 - ASP.Net
FluorineFx ASObject自动转换基础类 AutoParseASObject ,用于Flash AMF协议解析
来源:网络   作者:   更新时间:2012-05-12
收藏此页】    【字号    】    【打印】    【关闭

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

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

FluorineFx ASObject自动转换基础类 AutoParseASObject ,用于Flash AMF协议解析

  转换为.NET中战场信息类

FluorineFx ASObject自动转换基础类 AutoParseASObject ,用于Flash AMF协议解析

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

  下面是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); }

    }

}

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明