2
我有一個Expression<Func<IMyclass, int>>
,我想將其轉換爲類型爲Expression<Action<object, object>>
的setter。這怎麼能實現?從Expression <Func <IMyclass,int >>創建setter表達式<Action <object,object >>
問題是object
參數。使用正確的類型(string
)這很容易。
class Foo
{
public Bar Bar { get; set; }
}
class Bar
{
public string Baz { get; set; }
}
static void Main(string[] args)
{
var expr = GetExpression(t => t.Bar.Baz);
var member = expr.Body as MemberExpression;
var p = Expression.Parameter(typeof(object), "p");
// This does not work...
var assign = Expression.Assign(member, p);
var lambda = Expression.Lambda<Action<object, object>>(assign, p);
object o = new Foo();
object v = "test";
lambda.Compile().Invoke(o, v);
}
private static Expression<Func<Foo, string>> GetExpression(Expression<Func<Foo, string>> expr)
{
return expr;
}
美麗!這可以在沒有ExpressionVisitor的情況下完成嗎?或者這會更復雜? – l33t
是的,這將會複雜得多,因爲你必須真正做同樣的訪問者已經爲你做,但你自己。表達式樹是不可變的,所以你不能修改它的某些部分 - 你需要創建新的樹。 – Evk
我認爲你應該能夠簡化你的訪問者:在'VisitParameter'中改變'Expression.Convert'並擺脫'VisitMember'。 – svick