有沒有辦法將Expression<Func<T, object>>
轉換爲Expression<Func<object, object>>
?如何將表達式<Func <T, object>>轉換爲表達式<Func <object,object >>
回答
我不得不之前做到這一點...
public static class ExpressionHelper {
public static Expression<Func<object,object>> ConvertParameterToObject<T>(this Expression<Func<T,object>> source){
return source.ReplaceParametersWithBase<T,object,object>();
}
public static Expression<Func<TBase,TResult>> ReplaceParameterWithBase<T,TResult,TBase>(this Expression<Func<T,TResult>> lambda)
where T :TBase
{
var param = lambda.Parameters.Single();
return (Expression<Func<TBase,TResult>>)
ParameterRebinder.ReplaceParameters(new Dictionary<ParameterExpression, ParameterExpression>
{
{ param, Expression.Parameter(typeof (TBase), param.Name) }
}, lambda.Body);
}
}
public class ParameterRebinder : ExpressionVisitor
{
private readonly Dictionary<ParameterExpression, ParameterExpression> map;
public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
{
this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
}
public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
{
return new ParameterRebinder(map).Visit(exp);
}
protected override Expression VisitParameter(ParameterExpression p)
{
ParameterExpression replacement;
if (map.TryGetValue(p, out replacement))
{
p = replacement;
}
return base.VisitParameter(p);
}
}
嘗試使用你的函數'返回新的ParameterRebinder(map).Visit(exp);'帶有錯誤信息:'System.String NewDescription'沒有爲'System.Object'類型定義。 – 2011-05-13 10:10:51
這個錯誤是有道理的。一旦你替換參數,你無法知道對象是什麼類型,所以成員將不會被定義。在這種情況下,你可能需要做一個'Compile()',像'Expression
我試圖自己回答這個問題,並以相同的解決方案結束。轉換不會成功使用其參數而不是對象的其他類型的表達式。 – Mic 2011-11-18 14:28:48
怎麼是這樣的:
static Expression<Func<object,object>> ConvertFunction<T>(Expression<Func<T,object>> function)
{
ParameterExpression p=Expression.Parameter(typeof(object));
return Expression.Lambda<Func<object,object>>
(
Expression.Invoke(function,Expression.Convert(p,typeof(T))), p
);
}
那麼你可以說這樣的事情:
Expression<Func<string,object>> foo=s=>s.Length;
Expression<Func<object,object>> bar=ConvertFunction(foo);
var call=bar.Compile();
Console.Write(call("hello")) ; // Prints 5
這和'return x => function.Compile()((T)x)'有沒有區別? – smartcaveman 2011-05-13 10:27:59
此方法將表達式從'{o => o.NewDescription}'改爲'{Param_0 =>調用(o => o.NewDescription,Convert(Param_0))}'是否有辦法保持相同的表達式? – 2011-05-13 13:50:22
- 1. 將表達式<Func<T, U>>轉換爲表達式<Func <object,object >>
- 2. 將表達式<Func <T,TProperty >>轉換爲表達式<Func <object,object >>,反之亦然
- 3. 將表達式<Func <XClass,object >>轉換爲表達式<Func <YClass,object >>
- 4. 如何將Func <T, object>轉換爲Func <dynamic,object>?
- 5. Func <T>如何隱式轉換爲表達式<Func<T>>?
- 6. 將表達式<Func <IBar, T>>轉換爲表達式<Func<Bar, T>>
- 7. 如何將表達式<Func <T, bool>>轉換爲表達式<Func <Type, bool>>?
- 8. 表達<Func鍵<T, object>>的通用開箱表達式<Func鍵<T, TResult>>
- 9. IQueryable的<T> .INCLUDE <T, object>>(表達式<Func鍵<T, object>>不工作
- 10. 拉開表達式<Func <T, object>>
- 11. 如何將IQueryable <T>轉換爲表達式<Func <T, bool>>?
- 12. 如何Func鍵<T,bool>轉換爲表達<Func<T,bool>>
- 13. 表達<Func鍵<in T, bool>>或表達<Func鍵<TBase,bool>>表達式<Func<T,bool>>轉換器
- 14. 如何在表達式<Func<T,bool>>中編寫表達式<Func<T>>
- 15. 將表達式<Func <TModel,TValue >>轉換爲表達式<Func <TModel,bool >>
- 16. asp.net mvc將表達式<Func <TModel,TProperty >>轉換爲表達式<Func <TModel,bool >>
- 17. 轉換表達<Func鍵<FromType>>以表達<Func<ToType>>
- 18. 從表達式<Func <TypeIn,TypeOut1 >>轉換爲表達式<Func <TypeIn,TypeOut2 >>
- 19. 從表達式<Func <TModel,字符串>>轉換爲表達式<Func <TModel,bool >>
- 20. 將表達式轉換爲表達式<Func <T, bool>>
- 21. 轉換表達<Func鍵<T, bool?>>以表達<Func鍵<T, bool>>
- 22. 從單參數獲取Func <T>和表達式<Func<T>>
- 23. 轉換表達式<Func <T,可爲空<V> >>
- 24. 如何將LambdaExpression轉換爲鍵入的表達式<Func<T, T>>
- 25. 將lambda表達式轉換爲Func <IObserver <char>,IDisposable>
- 26. 無法在表達式<Func<...>>和Func <...>之間轉換
- 27. 創建表達式<Func <IQueryable <T>,IOrderedQueryable <T> >>?
- 28. 轉換表達<Func鍵<TInterface,布爾>>表達式<Func鍵<TImplementation,布爾>>
- 29. 如何表達<Func鍵<T1, bool>>轉換爲表達<Func鍵<T2, bool>>
- 30. 從Expression <Func <IMyclass,int >>創建setter表達式<Action <object,object >>
鑄造'T'是'object'?像'(object)T' – 2011-05-13 09:35:03
我應該怎麼做呢?我得到了'Expression> nameSelector',我需要將'nameSelector'作爲'Expression >'傳遞給另一個函數 –
2011-05-13 09:39:56