简体   繁体   English

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

[英]How to pass a lambda expression to a method expecting lambda expression?

I have an extension method to get a property name as string:我有一个扩展方法来获取属性名称作为字符串:

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

Now I have another method, expecting to pass in list (param) of this kind of property lamba expression.现在我有另一种方法,期望传入这种属性lamba表达式的列表(参数)。 I want this new method to reuse the 1st method, but can't figure out how to pass it over我希望这个新方法可以重用第一种方法,但不知道如何传递它

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

expected usage:预期用途:

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

Update: Backs answer worked once I change my GetPropertyName to cater for UnaryExpression:更新:一旦我更改了我的 GetPropertyName 以迎合 UnaryExpression,Backs 答案就起作用了:

    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));
    }
var howToCodeThis = GetPropertyName(default(T), p);

OR或者

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

But I noteced, you don't use obj in GetPropertyName method.但我注意到,您没有在 GetPropertyName 方法中使用obj

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM