2008-12-27 83 views
4

在表達式樹中調用實例方法的最佳方式是什麼?我目前的解決方案是這樣的接口IColumn的接口方法「對象GetRowValue(rowIndex)」。在表達式樹中調用實例方法的最佳方法?

public static Expression CreateGetRowValueExpression(
    IColumn column, 
    ParameterExpression rowIndex) 
     { 
      MethodInfo methodInfo = column.GetType().GetMethod(
       "GetRowValue", 
       BindingFlags.Instance | BindingFlags.Public, 
       null, 
       CallingConventions.Any, 
       new[] { typeof(int) }, 
       null); 
      var instance = Expression.Constant(column); 
      return Expression.Call(instance, methodInfo, rowIndex);    
     } 

有沒有更快的方法?是否可以創建表達式而不必將方法名稱作爲字符串傳遞(對重構不利)?

回答

8

你可以用一個輔助方法做到這一點:

MethodCallExpression GetCallExpression<T>(Expression<Func<T>> e) 
{ 
    return e.Body as MethodCallExpression; 
} 

/* ... */ 
var getRowValExpr = GetCallExpression(x => x.GetRowValue(0));