首页 > 解决方案 > C# lambda 返回 System.Linq.Expressions.Expression 的问题

问题描述

我在分配以下代码时遇到了一个大问题,我不知道如何解决它,我想使用 lambda 运算符。

 System.Linq.Expressions.Expression expression = null;
 if (typeof(ICustomTypeDescriptor).IsAssignableFrom(sourceType))
 {
            System.Linq.Expressions.Expression expression2 = System.Linq.Expressions.Expression.Convert(parameterExpression, typeof(ICustomTypeDescriptor));
            expression = (ICustomTypeDescriptor t, object o) =>
            {
                t.GetProperties()[propertyName].GetValue(o)
                }
            ;
            return System.Linq.Expressions.Expression.Invoke(expression, new System.Linq.Expressions.Expression[]
            {
                expression2,
                parameterExpression
            });
        }

问题在于这部分 在此处输入图像描述

可以用其他方式声明吗?

错误

无法将 lambda 表达式元素转换为“表达式”类型,因为它不是委托类型

标签: c#lambdaexpression

解决方案


You are using multilines lambda expression, which is ok. But you need to end each line with ";".

I think this would work but without the whole code it will be hard to be sure :

System.Linq.Expressions.Expression expression = null;
if (typeof(ICustomTypeDescriptor).IsAssignableFrom(sourceType))
{
    System.Linq.Expressions.Expression expression2 = System.Linq.Expressions.Expression.Convert(parameterExpression, typeof(ICustomTypeDescriptor));
    expression = (ICustomTypeDescriptor t, object o) =>
    {
        t.GetProperties()[propertyName].GetValue(o);
    };
    return System.Linq.Expressions.Expression.Invoke(expression, new System.Linq.Expressions.Expression[]
    {
        expression2,
        parameterExpression
    });
}

You can also go for singleline lambda :

System.Linq.Expressions.Expression expression = null;
if (typeof(ICustomTypeDescriptor).IsAssignableFrom(sourceType))
{
    System.Linq.Expressions.Expression expression2 = System.Linq.Expressions.Expression.Convert(parameterExpression, typeof(ICustomTypeDescriptor));
    expression = (ICustomTypeDescriptor t, object o) => t.GetProperties()[propertyName].GetValue(o);
    return System.Linq.Expressions.Expression.Invoke(expression, new System.Linq.Expressions.Expression[]
    {
        expression2,
        parameterExpression
    });
}

Please care, I haven't tested the code to check if I'm not wrong.


推荐阅读