毕竟,我知道AutoMapper,我不想使用它。因为我正在学习C#,我想深入了解它。所以我正在尝试自己解决这个问题(如下所述)。
但是,我正在尝试创建一个属性复制器,以将一种类型的属性的值对应到另一种类型的属性,如果该属性具有相同的名称和类型并且可以从源读取并且在目标中可写。我正在使用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
完成问:
我从@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() { }