transferencia de valores de propiedades de un objeto a otro
Antes de todo, sé sobre AutoMapper, y no quiero usarlo. Porque estoy aprendiendoC y quiero recibir una visión profunda de ello. Así que estoy tratando de resolver este problema (explicado a continuación) yo mismo.
Sin embargo, estoy tratando de crear una copiadora de propiedades para hacer frente a los valores de las propiedades de un tipo a otro, si la propiedad tiene el mismo nombre y tipo y es legible desde el origen y se puede escribir en el destino. Estoy usandotype.GetProperties()
método. El método muestreado está aquí:
static void Transfer(object source, object target) {
var sourceType = source.GetType();
var targetType = target.GetType();
var sourceProps = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
var targetProps = (from t in targetType,.GetProperties()
where t.CanWrite
&& (t.GetSetMethod().Attributes & MethodAttributes.Static) == 0
select t).ToList();
foreach(var prop in sourceProps) {
var value = prop.GetValue(source, null);
var tProp = targetProps
.FirstOrDefault(p => p.Name == prop.Name &&
p.PropertyType.IsAssignableFrom(prop.PropertyType));
if(tProp != null)
tProp.SetValue(target, value, null);
}
}
Funciona, pero leí una respuesta en SO, que usandoSystem.Reflection.Emit
yILGenerator
y delegados vinculados tarde son más rápidos y tienen un mayor rendimiento. Pero no hubo más explicaciones ni ningún enlace. ¿Me pueden ayudar a comprender formas de acelerar este código? o puedes sugerirme algunos enlaces sobreEmit
, ILGenerator
y delegados vinculados tarde ¿Por favor? ¿O algo que creas que me ayudará a someterme? Gracias por adelantado
COMPELETE Q:
Entiendo y aprendo muchas cosas de la respuesta de @ svick. Pero ahora, si quiero usarlo como un método genérico abierto, ¿cómo puedo hacerlo? algo como esto
public TTarget Transfer<TSource, TTarget>(TSource source) where TTarget : class, new() { }
o una extensión:
public static TTarget Transfer<TSource, TTarget>(this TSource source) where TTarget : class, new() { }