嘗試創建表達式樹來執行對象映射器類型的事情。表達式樹複製對象
Type ts = typeof(Source);
Type td = typeof(Dest);
ParameterExpression val = Expression.Parameter(ts);
ParameterExpression ret = Expression.Parameter(td);
PropertyInfo[] propsS = ts.GetProperties();
PropertyInfo[] propsD = td.GetProperties();
List<Expression> lst = new List<Expression>();
foreach (PropertyInfo pi in propsS)
{
PropertyInfo piD = propsD.Where(x => x.Name == pi.Name).FirstOrDefault();
if (piD != null)
{
MethodInfo ge = pi.GetGetMethod();
MethodInfo se = piD.GetSetMethod();
var v1 = Expression.Call(val, ge);
var v2 = Expression.Call(ret, se, v1);
lst.Add(v2);
}
}
lst.Add(Expression.Return(Expression.Label(td), ret));
BlockExpression block = Expression.Block(
new[] { ret },
lst.ToArray()
);
//Func<Source, Dest> v = Expression.Lambda<Func<Source, Dest>>(block, val).Compile();
var v = Expression.Lambda(block, val);
所以,這就是我現在有...它非常接近,但沒有看到我錯過了什麼?
v就出來:
.Lambda #Lambda1<System.Action`1[ConsoleApplication2.Source]>(ConsoleApplication2.Source $var1) {
.Block(ConsoleApplication2.Dest $var2) {
.Call $var2.set_S1(.Call $var1.get_S1());
.Call $var2.set_S2(.Call $var1.get_S2());
.Call $var2.set_I1(.Call $var1.get_I1());
.Call $var2.set_I2(.Call $var1.get_I2());
.Call $var2.set_S3(.Call $var1.get_S3());
.Call $var2.set_S4(.Call $var1.get_S4());
.Call $var2.set_S5(.Call $var1.get_S5());
.Return #Label1 { $var2 }
}
}
- 我需要在某處新增$ var2嗎?
- 有沒有更好的方法來做這些工作?
- 該lambda似乎沒有看到返回值...
- 我需要做塊嗎?或者,還有更好的方法?
返回的lambda需要是'Func',以便傳遞兩個對象或需要創建'Dest'。你目前爲'var2'定義了一個局部變量,但是'var2'永遠不會構造(或者傳入) –
Rob
@Rob - 我想要Func結果,但編譯器認爲它仍然是一個Action儘管我有一個回報...我需要如何修改代碼以新增$ var2裏面? –
SledgeHammer