using System.Linq.Expressions; namespace MSAdminUsuarios.Utils { public static class GenericTools { /// /// Permite clonar los valores de un objeto recorriendo cada parámetro /// (,,). /// /// Objeto el cual se va a leer sus propiedades y valores /// Objeto el cual se va a ESCRIBIR los valores del origen basado en el nombre de la propiedad. /// Lista con nombres de propiedades a excluir de la copia public static void CloneObj(T origin, T destiny, params Expression>[] exceptions) where T : class { var destinyProps = typeof(T).GetProperties(); var exceptionProps = new HashSet(); if (exceptions != null) { foreach (var exception in exceptions) { if (exception.Body is MemberExpression memberExpression) { exceptionProps.Add(memberExpression.Member.Name); } } } foreach (var prop in typeof(T).GetProperties()) { var originName = prop.Name; if (exceptionProps.Contains(originName)) continue; for (int i = 0; i < destinyProps.Length; i++) { if (destinyProps[i].Name == originName) { destinyProps[i].SetValue(destiny, prop.GetValue(origin, null)); i = destinyProps.Length + 1; } } } } /// /// Permite tomar parcialmente la información de un obejto Origen, validar si existe en el destino y si es diferente de nulo, para setearle el valor asignado /// (,,). /// /// Objeto el cual se va a leer sus propiedades y valores /// Objeto el cual se va a ESCRIBIR los valores del origen basado en el nombre de la propiedad. /// Lista con nombres de propiedades a excluir de la copia public static void ClonePartialObj(TFrom origin, TTo destiny, params Expression>[] exceptions) where TTo : class { var destinyProps = typeof(TTo).GetProperties(); var exceptionProps = new HashSet(); if (exceptions != null) { foreach (var exception in exceptions) { if (exception.Body is MemberExpression memberExpression) { exceptionProps.Add(memberExpression.Member.Name); } } } foreach (var prop in typeof(TFrom).GetProperties()) { var originName = prop.Name; var originValue = prop.GetValue(origin, null); if (exceptionProps.Contains(originName)) continue; for (int i = 0; i < destinyProps.Length; i++) { if (destinyProps[i].Name == originName && originValue != null) { destinyProps[i].SetValue(destiny, originValue); i = destinyProps.Length + 1; } } } } } }