首先我知道“AutoMapper”,但我不想使用它。因为我正在学习C#,想要深入了解它。所以我尝试自己解决这个问题(如下所述)。但是,如果属性的名称和类型相同,并且从源中可读且在目标中可写,则我正在尝试创建一个属性复制程序来复制一种类型的值到另一种类型上。我正在使用“type.GetProperties()”方法。以下是示例方法:
它可以工作,但我在SO上读到一个答案,使用System.Reflection.Emit和ILGenerator和late-bound delegates更快且性能更高。但是没有更多的解释或任何链接。您能帮助我了解加速此代码的方法吗?或者您能向我建议一些关于Emit、ILGenerator和late-bound delegates的链接吗?或者您认为对主题有所帮助的任何内容?
完整问题:
我从@svick的答案中理解并学到了很多东西。但现在,如果我想将其用作开放式通用方法,该怎么做?像这样的东西:
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和late-bound delegates更快且性能更高。但是没有更多的解释或任何链接。您能帮助我了解加速此代码的方法吗?或者您能向我建议一些关于Emit、ILGenerator和late-bound delegates的链接吗?或者您认为对主题有所帮助的任何内容?
完整问题:
我从@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() { }