2015-11-03 176 views
2

我有一個擴展方法來獲得一個屬性名作爲字符串:如何將lambda表達式傳遞給期望lambda表達式的方法?

public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId) 
    { 
     return ((MemberExpression)propertyId.Body).Member.Name; 
    } 

現在我有另一種方法,希望在名單通過這種財產蘭巴表達的(PARAM)。 我希望這種新方法重新使用第一方法,但無法弄清楚如何將它越過

public string Test<T>(params Expression<Func<T, object>>[] ps) 
    { 
     foreach (var p in ps) 
     { 
       var howToCodeThis = p.GetPropertyName(dummy => dummy); 

預期使用:

   var result = Test<Something>(request.Sorting 
       , x => x.prop1 
       , x => x.prop2 
       , x => x.prop3 
       ); 

更新: 後背答案工作,一旦我改變我GetPropertyName迎合UnaryExpression:

public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId) 
    { 
     if (propertyId.Body is MemberExpression) 
      return ((MemberExpression)propertyId.Body).Member.Name; 

     if (propertyId.Body is UnaryExpression) 
     { 
      var op = ((UnaryExpression)propertyId.Body).Operand; 
      return ((MemberExpression)op).Member.Name; 
     } 

     throw new NotImplementedException(string.Format("GetPropertyName - {0}", propertyId.Body.GetType().FullName)); 
    } 
+0

我問了一個非常類似的問題不是很久以前:http://stackoverflow.com/questions/30734899/passing-a-lambda-expression-as-parameter-to-a-method –

+1

我投了你的問題。我真的很討厭ppl,只是簡單地downvote一個問題沒有理由。 – Kelmen

+0

謝謝。如果有解釋,Downvotes是有幫助的,我同意你的看法。 –

回答

1
var howToCodeThis = GetPropertyName(default(T), p); 

OR

var howToCodeThis = default(T).GetPropertyName(p); 

但我提醒你,在GetPropertyName方法中不要使用obj

+0

我認爲'obj'的原因是推理類型參數有效。 – svick

+0

該方法是一個擴展,這是編碼語法的方式。使用它是這樣的myObj.GetPropertyName(x => x.Prop) – Kelmen

+0

@Kelmen是的,你可以。更新回答 – Backs