【发布时间】:2015-08-29 17:41:53
【问题描述】:
这是在数据层上,因此性能非常重要。否则我会使用 Automapper。如果是 IDBConnection,我会使用 Dapper。
我想将匿名对象的简单创作带到 POCO,并使用编译表达式来表达它。
代码
public class Foo
{
public string Bar{get;set;}
public string Baz{get;set;}
}
public void doStuff()
{
var obj = new{Bar= "My Name, Baz = "Some other data"};
//can I recreate this assignment to foo using expressions?
var foo = new Foo{
Bar = obj.Bar,
Baz = obj.Baz
}
}
(不完整)到目前为止我...
var props = o.GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
foreach (var prop in props)
{
var targetProp = typeof(T).GetProperty(prop.Name);
var targetExp = Expression.Parameter(typeof(T), "target");
var valueExp = Expression.Parameter(prop.PropertyType, "property");
var propExp = Expression.Property(targetExp, targetProp);
var assignExp = Expression.Assign(propExp, valueExp);
var setter = Expression.Lambda<Action<T, object>>(assignExp, targetExp, valueExp).Compile();
}
当前问题
- 如何将 setter 组合成返回编译的委托?
- 如何在循环属性时创建 Lambda[Action] 泛型类型?
感谢您的任何意见。
【问题讨论】:
-
不清楚这里的上下文是什么——这已经是一个接受匿名类型作为类型参数、
typeof(Foo)作为参数的泛型方法了吗? -
顺便说一句,找出 like 的作用的最简单方法是编写一个 lambda 表达式编译成表达式树,然后反编译它。
-
第一部分:该方法类似于“T MapFrom
(object obj)”,其中保证对象始终是同一个匿名对象。第二部分:好主意。我现在就试试。 -
为什么不创建一次映射委托,然后重用它?
-
一定要试试 FastMapper/Mapster。它们生成动态 IL 来映射对象,因此性能比 Automapper 好一个数量级。
标签: c# lambda linq-expressions