這是你在找什麼?這個方法有兩種風格:第一種可以讓你傳入新的輸入類型作爲參數;第二種方法允許您將輸入類型作爲泛型參數傳遞,並獲得強類型的LambdaExpression。
public static LambdaExpression ChangeInputType<T, TResult>(Expression<Func<T, TResult>> expression, Type newInputType)
{
if (!typeof(T).IsAssignableFrom(newInputType))
throw new Exception(string.Format("{0} is not assignable from {1}.", typeof(T), newInputType));
var beforeParameter = expression.Parameters.Single();
var afterParameter = Expression.Parameter(newInputType, beforeParameter.Name);
var visitor = new SubstitutionExpressionVisitor(beforeParameter, afterParameter);
return Expression.Lambda(visitor.Visit(expression.Body), afterParameter);
}
public static Expression<Func<T2, TResult>> ChangeInputType<T1, T2, TResult>(Expression<Func<T1, TResult>> expression)
{
if (!typeof(T1).IsAssignableFrom(typeof(T2)))
throw new Exception(string.Format("{0} is not assignable from {1}.", typeof(T1), typeof(T2)));
var beforeParameter = expression.Parameters.Single();
var afterParameter = Expression.Parameter(typeof(T2), beforeParameter.Name);
var visitor = new SubstitutionExpressionVisitor(beforeParameter, afterParameter);
return Expression.Lambda<Func<T2, TResult>>(visitor.Visit(expression.Body), afterParameter);
}
public class SubstitutionExpressionVisitor : ExpressionVisitor
{
private Expression before, after;
public SubstitutionExpressionVisitor(Expression before, Expression after)
{
this.before = before;
this.after = after;
}
public override Expression Visit(Expression node)
{
return node == before ? after : base.Visit(node);
}
}
'我真正需要的是一種採用類型參數並執行轉換的方法。「 - 什麼? bool是什麼?你需要轉換方法嗎?還是有條件的?我不明白 – 2013-03-04 22:59:43
'T1'和'T2'如何相關?有甚至有辦法在它們之間進行轉換嗎? – cdhowie 2013-03-04 23:00:16
T2源自T1。 – Hernan 2013-03-04 23:10:47