C# 如何将lambda表达式传递给需要lambda表达式的方法?

C# 如何将lambda表达式传递给需要lambda表达式的方法?,c#,lambda,expression-trees,C#,Lambda,Expression Trees,我有一个扩展方法可以将属性名称作为字符串获取: public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId) { return ((MemberExpression)propertyId.Body).Member.Name; } 公共静态字符串GetPropertyName(此T

我有一个扩展方法可以将属性名称作为字符串获取:

    public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId)
    {
        return ((MemberExpression)propertyId.Body).Member.Name;
    }
公共静态字符串GetPropertyName(此T对象,表达式propertyId)
{
返回((MemberExpression)propertyId.Body).Member.Name;
}
现在我有了另一个方法,希望传入这种属性lamba表达式的list(param)。 我想让这个新方法重用第一个方法,但不知道如何传递它

    public string Test<T>(params Expression<Func<T, object>>[] ps)
    {
        foreach (var p in ps)
        {
                var howToCodeThis = p.GetPropertyName(dummy => dummy);
公共字符串测试(参数表达式[]ps)
{
foreach(以ps表示的var p)
{
var howToCodeThis=p.GetPropertyName(dummy=>dummy);
预期用途:

                var result = Test<Something>(request.Sorting
                , x => x.prop1
                , x => x.prop2
                , x => x.prop3
                );
var结果=测试(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));
    }
公共静态字符串GetPropertyName(此T对象,表达式propertyId)
{
if(propertyId.Body为MemberExpression)
返回((MemberExpression)propertyId.Body).Member.Name;
if(propertyId.Body是一元表达式)
{
var op=((UnaryExpression)propertyId.Body).操作数;
return((MemberExpression)op).Member.Name;
}
抛出新的NotImplementedException(string.Format(“GetPropertyName-{0}”,propertyId.Body.GetType().FullName));
}


但是我注意到,你在GetPropertyName方法中不使用
obj

不久前我问了一个非常类似的问题:我投票赞成你的问题。我真的很讨厌ppl只是无缘无故地否决一个问题。谢谢。如果有解释的话,否决票是有帮助的,我同意你的看法。我认为
obj
的原因是这样的吗rring类型参数有效。该方法是一个扩展,这是编码语法的方式。使用它的方式是myObj.GetPropertyName(x=>x.Prop)我只能使用第二个选项,因为该方法是一个扩展方法。它不起作用,出现错误:无法将“System.Linq.Expressions.UnaryExpression”类型的对象强制转换为“System.Linq.Expressions.MemberExpression”类型。该问题是由于我的GetPropertyName引起的。我发布了有关此问题的更新,您的答案有效。
var howToCodeThis = GetPropertyName(default(T), p);
var howToCodeThis = default(T).GetPropertyName(p);