Created
November 12, 2014 06:51
-
-
Save tiantian20007/09179b4eb15e5a27b971 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//++ 合并两个pb结构++// | |
public static void mergeFromPb(object oldObj, object newObj, List<string> ignore_list = null){ | |
if(oldObj.Equals(newObj)) | |
return; | |
Type oldType = oldObj.GetType(); | |
Type newType = newObj.GetType(); | |
// if(oldType.Equals(newType) == false){ | |
// return; | |
// } | |
PropertyInfo[] newInfos = newType.GetProperties(); | |
PropertyInfo oldInfo = null; | |
FieldInfo fieldInfo = null; | |
PropertyInfo specifyInfo = null; | |
string proName = ""; | |
bool hasProperty = false; | |
foreach(PropertyInfo newInfo in newInfos){ | |
proName = newInfo.Name; | |
specifyInfo = newType.GetProperty(proName + "Specified"); | |
if(specifyInfo != null){ | |
hasProperty = (bool)specifyInfo.GetValue(newObj, null); | |
//Kof.Log(Kof.DEFAULT, "proName : " + proName + " Specified : " + hasProperty); | |
if(hasProperty == true){ | |
fieldInfo = oldType.GetField(proName); | |
if(fieldInfo != null && fieldInfo.IsPublic){ | |
fieldInfo.SetValue(oldObj, newInfo.GetValue(newObj, null)); | |
} | |
oldInfo = oldType.GetProperty(proName); | |
if(oldInfo != null && oldInfo.CanWrite == true){ | |
oldInfo.SetValue(oldObj, newInfo.GetValue(newObj, null), null); | |
} | |
} | |
} | |
else{ | |
Type type = newInfo.PropertyType; | |
if(type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) | |
{ | |
//merge list | |
//Debug.Log(proName + "/" + newInfo.PropertyType); | |
PropertyInfo listCountInfo = type.GetProperty("Count"); | |
if(listCountInfo != null){ | |
object newListObj = newInfo.GetValue(newObj, null); | |
int itemCount = (int)listCountInfo.GetValue(newListObj, null); | |
//Kof.Log(Kof.DEFAULT, "itemCount : " + itemCount); | |
//++如果newList的长度<=0,则忽略;如果>0,则用newList的数据替换oldList的++// | |
if(itemCount > 0){ | |
oldInfo = oldType.GetProperty(proName); | |
if(oldInfo != null){ | |
object oldListObj = oldInfo.GetValue(oldObj, null); | |
//++先移除++// | |
MethodInfo remove = oldInfo.PropertyType.GetMethod("Clear"); | |
remove.Invoke(oldListObj, new object[]{}); | |
//++再添加++// | |
MethodInfo method = oldInfo.PropertyType.GetMethod("AddRange"); | |
if(method != null){ | |
method.Invoke(oldListObj, new object[]{newListObj}); | |
} | |
} | |
else{ | |
fieldInfo = oldType.GetField(proName); | |
if(fieldInfo != null){ | |
fieldInfo.SetValue(oldObj, newInfo.GetValue(newObj, null)); | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment