9
votes

.NET: Y a-t-il une classe à copier des propriétés d'une classe à une autre

J'ai écrit une fonction qui copie les propriétés d'une classe à une autre, faites donc une copie d'un objet.

alors quelque chose comme xxx

où myObject et myotherObject sont du même type. Je le fais en faisant de manière bascelle xxx

Je suis sûr que je suis sûr dans le passé, j'ai utilisé un objet .NET que Automaticaly a fait cela, par réflexion, je suppose, mais je ne m'en souviens pas ... ou un j'imaginant qu'une telle méthode existe?

Oui, je suis au courant du mappeur automatique, mais j'étais sûr (pas tellement maintenant) qu'il existe un objet .NET qui fait le travail. Peut-être pas!


0 commentaires

8 Réponses :


1
votes

Essayez une description dans ce lien:

. Réflexion nette - Propriétés de la classe de copie


0 commentaires

11
votes

Vous pouvez regarder automapper .


1 commentaires

J'ai dû vérifier les horodatages pour celui-ci :)



6
votes

Vous devez utiliser Automapper Il a été construit pour ce travail.


2 commentaires

La question est de savoir comment effectuer une copie d'un objet, et non comment copier les valeurs de propriété d'un objet à un autre objet.


Vous pouvez cloner des objets de cette façon aussi.



2
votes

1 commentaires

Salut bitbonk, qui ne copie pas les types de référence, il copie simplement la référence



1
votes

Ce code devrait fonctionner pour les types de propriétés de base, pas sûr de savoir comment cela ira pour quelque chose de complexe (listes, tableaux, classes personnalisées). Devrait être un point de départ cependant: xxx


0 commentaires

7
votes
 public static class ext
{
    public static void CopyAllTo<T>(this T source, T target)
    {
        var type = typeof(T);
        foreach (var sourceProperty in type.GetProperties())
        {
            var targetProperty = type.GetProperty(sourceProperty.Name);
            targetProperty.SetValue(target, sourceProperty.GetValue(source, null), null);
        }
        foreach (var sourceField in type.GetFields())
        {
            var targetField = type.GetField(sourceField.Name);
            targetField.SetValue(target, sourceField.GetValue(source));
        }
    }
}

2 commentaires

L'automapper mentionné ci-dessus est beaucoup plus puissant, mais pour des cas d'utilisation simples comme la mienne, c'est beaucoup plus simple et plus rapide pour faire fonctionner. Merci!


COMASPAPPER vous donnera un nouvel objet de référence avec les propriétés copiées, tandis que cette solution copiera des propriétés entre les références existantes qui répond à la question



0
votes

En termes très simples: comme nous savons que les classes sont des types de référence en C # .NET, c'est-à-dire lorsque nous créons un objet d'une classe telle que

C2.Id=1;
C2.Name="Mukesh";


0 commentaires

1
votes

Je sais que l'OP n'a pas demandé un type à un autre type, mais ma variante est celle que j'utilise pour DI dans Startup.cs pour des incompatibles dans des configurations entre le nuage et l'environnement de développement local. Ma classe locale utilise généralement une classe d'interface dans les coulisses pour mapper les configurations. Ensuite, j'utilise cette méthode pour copier des propriétés où elles ne correspondent qu'au nom. Je ne vérifie pas les types de propriétés car ce sont des configurations. Automapper a été suggéré. Je n'utilise pas automapper parce que nous sommes restreints par U.S. DOD à certains fournisseurs. Obtenir un ATO est assez difficile à utiliser .net, nous n'avons plus besoin de chagrin.

  using System.Linq;
  public static class PropertyCopy
  {
    public static void CopyAllTo<T,T1>(this T source, T1 target)
    {
      var type = typeof(T);
      var type1 = typeof(T1);
      foreach (var sourceProperty in type.GetProperties())
      {
        foreach (var targetProperty in type1.GetProperties()
          .Where(targetProperty => sourceProperty.Name == targetProperty.Name)
          .Where(targetProperty => targetProperty.SetMethod != null))
        {
          targetProperty.SetValue(target, sourceProperty.GetValue(source, null), null);
        }
      }

      foreach (var sourceField in type.GetFields())
      {
        foreach (var targetField in type1.GetFields()
          .Where(targetField => sourceField.Name == targetField.Name))
        {
          targetField.SetValue(target, sourceField.GetValue(source));
        }
      }

    }
  }


0 commentaires