該類用於Flash AMF協議解析
在做AMF協議應用時會遇到一個數據轉換問題,也就是從ASObject轉換成.NET的類
如:熱血三國中的戰場信息
轉換為.NET中戰場信息類
諸如此類的類型轉換,可以利用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); }
}
}