【问题标题】:Build Expression of Simple Func构建简单函数的表达式
【发布时间】:2025-12-26 14:10:10
【问题描述】:

我想为这样的东西构建表达式:

x => DoSomething(x)

有可能吗?我该如何做到这一点?

【问题讨论】:

  • 你问的是什么语言?

标签: c# lambda expression


【解决方案1】:

你可以这样做:

using System;
using System.Linq.Expressions;

public class Program
{
    public static void Main()
    {
        Expression<Func<string, string>> func = (x) => DoSomething(x);

        Console.WriteLine(func.ToString());
    }

    public static string DoSomething(string s)
    {
        return s; // just as sample
    }
}

这是工作小提琴 - https://dotnetfiddle.net/j1YKpM 它将被解析并 Lambda 将被保存为表达式

【讨论】:

    【解决方案2】:

    您的意思是Func&lt;Tin,Tout&gt; 代表吗?

    基本上你需要一个Func&lt;Tin,Tout&gt;

    Func<Tin,Tout> func = x=> DoSomething(x)
    

    其中x 的类型为TinDoSomething 返回Tout 类型

    【讨论】:

    • 这不是表达式。它将被编译为匿名方法,而不是表达式
    【解决方案3】:

    也许这个问题有点不清楚。这就是我的意思:

    var arg = Expression.Parameter(pluginType, "x");
    var method = GetType().GetMethod("DoSomething");
    var methodCall = Expression.Call(method, arg);
    var lambda = Expression.Lambda(delegateType, methodCall, arg); // I was looking for this
    

    这就是我想要的。谢谢你的时间:)

    【讨论】:

    • 如果您不需要在运行时执行它并且您知道签名,那么您始终可以使用此类代码Expression&lt;Action&lt;string&gt;&gt; func = (x) =&gt; DoSomething(x);,因为它会生成与您的答案几乎相同的代码。
    • 是的,这只是更大(已经解决)问题的一小部分。我必须在运行时完成这一切。 Спасибо :)
    • 如果您有兴趣,这是我一直在努力解决的完整问题:*.com/questions/23593914/…
    • 我明白了,是的,那是有道理的。不客气:)