Copier de propriétés communes à 2 types différents

Contenu du snippet

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Tools
{
    public static class GenericsExtensions
    {
        #region Copier des propriétés communes à 2 classes différentes

        /// <summary>
        /// Retourner un nouvel objet de type U à partir des propriétés commune au type T
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="U"></typeparam>
        /// <param name="sender"></param>
        /// <returns></returns>
        public static U Copier<T, U>(this T sender) where U : new()
        {
            // Création d'une instance du type de retour
            U retour = new U();

            // Copier les propriétés de l'orinal vers le retour
            sender.Copier<T, U>(retour);

            return retour;
        }

        /// <summary>
        /// Copie les propriétés du type U à partir des propriétés commune au type T
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="U"></typeparam>
        /// <param name="sender"></param>
        /// <param name="retour"></param>
        public static void Copier<T, U>(this T sender,U retour)
        {
            var req = (
                // Selection des properties de l'objet original
                from s in typeof(T).GetProperties()

                // Selection des properties de l'objet de retour
                from r in typeof(U).GetProperties()

                // Jointure des properties
                where r.Name == s.Name && r.PropertyType == s.PropertyType

                select new { r, s })

                .ToArray();

            // Test si on a bien des donnée
            if (req != null
                && req.Length > 0)
            {
                for (Int32 i = 0; i < req.Length; i++)
                {
                    // 
                    req[i].r.SetValue(
                        retour,
                        req[i].s.GetValue(sender, null),
                        null);
                }
            }
        }

        /// <summary>
        /// Retourner un nouveau tableau d'objet de type U à partir des propriétés commune au tableau du type T
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="U"></typeparam>
        /// <param name="sender"></param>
        /// <returns></returns>
        public static U[] Copier<T, U>(this T[] sender) where U : new()
        {
            // Création d'une instance du type de retour
            U[] retour = new U[sender.Length];
            for (Int32 i = 0; i < sender.Length; i++)
            {
                retour[i] = new U();
            }

            // Copier les propriétés de l'orinal vers le retour
            sender.Copier<T, U>(retour);

            return retour;
        }

        /// <summary>
        /// Copie les propriétés du tableau de type U à partir des propriétés commune au tableau du type T
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="U"></typeparam>
        /// <param name="sender"></param>
        /// <param name="retour"></param>
        public static void Copier<T, U>(this T[] sender, U[] retour)
        {
            var req = (
                // Selection des properties de l'objet original
                from s in typeof(T).GetProperties()

                // Selection des properties de l'objet de retour
                from r in typeof(U).GetProperties()

                // Jointure des properties
                where r.Name == s.Name && r.PropertyType == s.PropertyType

                select new { r, s })

                .ToArray();

            // Test si on a bien des donnée
            if (req != null
                && req.Length > 0)
            {
                for (Int32 i = 0; i < sender.Length; i++)
                {
                    for (Int32 j = 0; j < req.Length; j++)
                    {
                        // 
                        req[j].r.SetValue(
                            retour[i],
                            req[j].s.GetValue(sender[i], null),
                            null);
                    }
                }
            }
        }

        #endregion
    }
}


Compatibilité : C# 3.x

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.