一切之前,我知道AutoMapper,我不希望使用它。因为我在学习C#,我想深入了解它。所以我试图自己做这个问题(下面解释)。transfering一个对象的属性值,另一个
不过,我试图创建一个属性复印机应付的一个类型的属性值,以一个又一个,如果属性具有相同的名称和类型,是从源头和可写在目标可读。我正在使用type.GetProperties()
方法。抽样方法是在这里:
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);
}
}
它的工作原理,但我在SO读一个答案,即使用System.Reflection.Emit
和ILGenerator
和后期绑定代表更迅速,具有更高的性能。但没有更多的解释或任何联系。你能帮我理解加速这段代码的方法吗?或者你可以建议我约Emit
,ILGenerator
一些链接,并后期绑定代表好吗?或者你认为的任何事情都会帮助我学习?提前致谢。
COMPELETE问:
我了解和@ svick的答案学到很多东西。但是现在,如果我想用它作为一个开放的泛型方法,我该怎么做呢?是这样的:
public TTarget Transfer<TSource, TTarget>(TSource source) where TTarget : class, new() { }
或扩展:
public static TTarget Transfer<TSource, TTarget>(this TSource source) where TTarget : class, new() { }
我不认为System.Reflection.Emit会帮你在这里。在你的情况下,源和目标对象都是在编译时存在的,你只是将相应属性的值从一个拷贝到另一个。如果您希望(例如)在运行时创建目标类型,则Emit将帮助您。 – 2012-03-18 21:07:05