Der folgende Editor bringt Ihnen einen Artikel C#, der Reflektion verwendet, um die Deep-Copy-Methode von Objekt zu implementieren. Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Editor, um einen Blick darauf zu werfen
Implementierungsmethode
Das gleichzeitige Kopieren von Unterobjekten durch Auflisten einzeln ist sehr arbeitsintensiv. intensiv. Wenn das Unterobjekt vom Typ Referenz ist, müssen Sie auch überlegen, ob Sie das Unterobjekt weiter kopieren möchten.
Wenn eine Klasse in tatsächlichen Anwendungen Dutzende von Unterobjekten hat, ist es für Entwickler langweilig und zeitaufwändig, diese einzeln zu kopieren.
Nutzen Sie also den Reflexionsmechanismus, um dies zu erreichen.
Wenn es jedoch auf dem Server ausgeführt wird, wird dennoch empfohlen, es manuell zu implementieren.
Schließlich ist der Reflexionsmechanismus langsamer als das direkte Schreiben.
Code:
public static class DeepCopyHelper { public static object Copy(this object obj) { Object targetDeepCopyObj; Type targetType = obj.GetType(); //值类型 if (targetType.IsValueType == true) { targetDeepCopyObj = obj; } //引用类型 else { targetDeepCopyObj = System.Activator.CreateInstance(targetType); //创建引用对象 System.Reflection.MemberInfo[] memberCollection = obj.GetType().GetMembers(); foreach (System.Reflection.MemberInfo member in memberCollection) { if (member.MemberType == System.Reflection.MemberTypes.Field) { System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member; Object fieldValue = field.GetValue(obj); if (fieldValue is ICloneable) { field.SetValue(targetDeepCopyObj, (fieldValue as ICloneable).Clone()); } else { field.SetValue(targetDeepCopyObj, Copy(fieldValue)); } } else if (member.MemberType == System.Reflection.MemberTypes.Property) { System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member; MethodInfo info = myProperty.GetSetMethod(false); if (info != null) { object propertyValue = myProperty.GetValue(obj, null); if (propertyValue is ICloneable) { myProperty.SetValue(targetDeepCopyObj, (propertyValue as ICloneable).Clone(), null); } else { myProperty.SetValue(targetDeepCopyObj, Copy(propertyValue), null); } } } } } return targetDeepCopyObj; } }
Das obige ist der detaillierte Inhalt vonC# verwendet Reflektion, um eine tiefe Kopie der Objektbeispielcodefreigabe zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!