gpt4 book ai didi

c# - 如何构建具有特定签名的表达式?

转载 作者:行者123 更新时间:2023-11-30 22:01:12 27 4
gpt4 key购买 nike

我正在尝试调用一个参数类型为 Expression<Func<T, string>> 的方法但是我构建的表达式树不允许我调用该方法。这是一个简短但完整的程序来演示问题:

using System;
using System.Linq.Expressions;

public class Test
{
public string Name { get { return ""; } }

public static void Main()
{
Foo<Test>();
}

static void Foo<T>()
{
var parameter = Expression.Parameter(typeof(T), "t");
var property = Expression.Property(parameter, "Name");
var lambda = Expression.Lambda(property, parameter);
Bar<T>(lambda);
}

static void Bar<T>(Expression<Func<T, string>> expression) {}
}

错误:

error CS1503: Argument 1: cannot convert from
'System.Linq.Expressions.LambdaExpression' to
'System.Linq.Expressions.Expression<System.Func<T, string>>'

如何将表达式树传递给方法?

最佳答案

您实际上已经构建了一个在执行 时具有正确类型的表达式树(如果您只是不尝试调用该方法,并打印出该对象的类型lambda 的值是指)。但是,lambda 的编译时类型只是LambdaExpression , 不是 Expression<Func<T, string>> .那是因为您使用的是 Expression.Lambda 的非泛型重载它设计用于当您在编译时知道所需的表达式树类型时使用。这在执行时做了正确的事情,但不允许您以强类型的方式使用它。

幸运的是,您确实知道要生成的表达式树的类型,因此您只需在调用 Expression.Lambda 的泛型重载时指定它:

var lambda = Expression.Lambda<Func<T, string>>(property, parameter);

如果你构建的表达式树没有正确的类型,这将在执行时抛出异常,例如如果Value1属性类型错误。

关于c# - 如何构建具有特定签名的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27928556/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com