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;
}
}
}
}
}
}