2015-11-03 192 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