C # Reflection – fusionner deux objects ensemble

J’ai besoin de mettre à jour la propriété de l’object A si null avec celle de la propriété équivalente de l’object B si ce n’est pas null. Je voulais du code que je peux utiliser pour divers objects.

J’avais une version qui fonctionnait jusqu’à ce que l’un des objects contienne une propriété de type List, c’est-à-dire un espace dans le code ci-dessous. Ma principale question est de savoir comment puis-je implémenter au mieux cette partie du code. Deuxièmement, existe-t-il une meilleure façon de procéder et, troisièmement, je sais que cela ne sera jamais rapide, mais toute suggestion visant à accélérer les choses serait appréciée.

Merci d’avance.

public T MergeWith(T primarySource, U secondarySource) where U : class, T { Type primaryType = typeof(T); Type secondaryType = typeof(U); foreach (PropertyInfo primaryInfo in primaryType.GetProperties()) { if (primaryInfo.CanWrite) { object currentPrimary = primaryInfo.GetValue(primarySource, null); PropertyInfo secondaryInfo = secondaryType.GetProperty(primaryInfo.Name); object currentSecondary = secondaryInfo.GetValue(secondarySource, null); if (currentPrimary == null && currentSecondary != null) { primaryInfo.SetValue(primarySource, currentSecondary, null); } else if ((currentPrimary != null && currentSecondary != null) && isChildClass(primaryInfo)) { if (isCollection(currentPrimary)) { // here } else { MethodInfo method = typeof(NavigationModel).GetMethod("MergeWith"); MethodInfo generic = method.MakeGenericMethod(primaryInfo.PropertyType, primaryInfo.PropertyType); object returnChild = generic.Invoke(this, new object[2] { currentPrimary, currentSecondary }); } } } } return primarySource; } private bool isCollection(object property) { return typeof(ICollection).IsAssignableFrom(property.GetType()) || typeof(ICollection).IsAssignableFrom(property.GetType()); } private bool isChildClass(PropertyInfo propertyInfo) { return (propertyInfo.PropertyType.IsClass && !propertyInfo.PropertyType.IsValueType && !propertyInfo.PropertyType.IsPrimitive && propertyInfo.PropertyType.FullName != "System.String"); } 

J’ai créé la méthode d’extension ci-dessous pour l’utiliser dans mon dernier projet et cela fonctionne très bien, collections et tout. C’est une version à peu près simple de ce que vous faites dans votre méthode. Avec le mien, les deux classes doivent être du même type. Quel problème rencontrez-vous avec les collections?

  public static class ExtensionMethods { public static TEntity CopyTo(this TEntity OriginalEntity, TEntity NewEntity) { PropertyInfo[] oProperties = OriginalEntity.GetType().GetProperties(); foreach (PropertyInfo CurrentProperty in oProperties.Where(p => p.CanWrite)) { if (CurrentProperty.GetValue(NewEntity, null) != null) { CurrentProperty.SetValue(OriginalEntity, CurrentProperty.GetValue(NewEntity, null), null); } } return OriginalEntity; } } 

Bonjour, j’ai modifié la solution de Ben Robinsons afin de ne pas écraser Collections ou liste. Elle ajoute les éléments d’un object à l’autre où la fusion est en cours:

  public static class ExtensionMethods { public static TEntity CopyTo(this TEntity OriginalEntity, TEntity EntityToMergeOn) { PropertyInfo[] oProperties = OriginalEntity.GetType().GetProperties(); foreach (PropertyInfo CurrentProperty in oProperties.Where(p => p.CanWrite)) { var originalValue = CurrentProperty.GetValue(EntityToMergeOn); if (originalValue != null) { IListLogic(OriginalEntity, CurrentProperty, originalValue); } else { var value = CurrentProperty.GetValue(OriginalEntity, null); CurrentProperty.SetValue(EntityToMergeOn, value, null); } } return OriginalEntity; } private static void IListLogic(TEntity OriginalEntity, PropertyInfo CurrentProperty, object originalValue) { if (originalValue is IList) { var tempList = (originalValue as IList); var existingList = CurrentProperty.GetValue(OriginalEntity) as IList; foreach (var item in tempList) { existingList.Add(item); } } } }