private static object CloneProxyObj(object source, Type objType, ObjectPoll objectPoll) { if (source == null) { return(null); } var result = objType.New(); objectPoll.Push(result); objType = result.GetType(); var pid = objType.GetProperty("_ID"); if (pid != null) { var idvalue = source.GetType().GetProperty("_ID").FastGetValue(source); pid.FastSetValue(result, idvalue); } foreach (var property in source.GetType().GetProperties()) { if (property.IsDefined <DisGenerateAttribute>()) { continue; } var p = objType.GetProperty(property.Name); if (p.Name == "_ID") { continue; } var value = property.FastGetValue(source); var list = value as IList; if (list != null) { var newlist = p.PropertyType.New <IList>(); var eleType = p.PropertyType.GetEnumerableElementType(); foreach (var item in list) { object newobj = null; if (!objectPoll.Find(item, ref newobj)) { newobj = CloneProxyObj(item, eleType, objectPoll); } newlist.Add(newobj); } value = newlist; } else if (!p.PropertyType.IsValueType && p.PropertyType != typeof(string)) { if (!objectPoll.Find(value, ref value)) { value = CloneProxyObj(value, p.PropertyType, objectPoll); } } p.FastSetValue(result, value); } return(result); }