我有一个扩展方法来获得一个属性名作为字符串:如何将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));
}
我问了一个非常类似的问题不是很久以前:http://stackoverflow.com/questions/30734899/passing-a-lambda-expression-as-parameter-to-a-method –
我投了你的问题。我真的很讨厌ppl,只是简单地downvote一个问题没有理由。 – Kelmen
谢谢。如果有解释,Downvotes是有帮助的,我同意你的看法。 –