c# - 将表达式的值打印为字符串

标签 c# .net

我想采用一个带变量的数学表达式并打印(分配给字符串)填充了变量的公式。

int iTwo = 2;
int iResult = 0;

iResult = iTwo * iTwo;

string theString = (iTwo * iTwo).ToString();

在上面的代码中iResult = 4 and theString = "4"

我想做一些填充变量并返回数学表达式的事情,例如:

theString = (iTwo * iTwo).ExpressionToString();    

最后是 theString = "2 * 2";

想法?

最佳答案

您可以使用 Expression<>类型。

public static string ExpressionToString<T>(Expression<Func<T>> e)
{
    var un = e.Body as BinaryExpression;
    if (un != null)
    {
        var left = un.Left.ToString();
        var leftEnd = left.Split('.').LastOrDefault();
        var right = un.Right.ToString();
        var rightEnd = right.Split('.').LastOrDefault();
        return e.Body.ToString().Replace(left, leftEnd).Replace(right, rightEnd);
    }
    return e.Body.ToString();
}

Console.WriteLine(ExpressionToString(() => iTwo * iTwo));

//prints (iTwo * iTwo)

您需要使方法更复杂才能解析比简单的二进制表达式更复杂的事物,但这是一般的想法。你可以做 e.Body.ToString() ,但由于为您的 lambda 生成匿名类型的方式,这可能会导致丑陋的结果,例如:"(value(TestApp.Program+<>c__DisplayClass3).iTwo * value(TestApp.Program+<>c__Dis playClass3).iTwo)" .

关于c# - 将表达式的值打印为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11351694/

相关文章:

c# - 带有 nuget 的 MS Build Extension Pack 无法获取 MSBuild.ExtensionPack.tasks

c# - 在 C# 中的 Web 服务上填充任何元素

.net - 我为什么要使用 Prism ?

c# - 无法将 ASP.NET 应用程序连接到 Docker 上的 SQL Server

.net - 如何将 SMTP 与 c# 4/.NET 4 连接到端口 465/SSL(当前不受支持)...需要想法

c# - WPF ObservableCollection 在创建新的 ObservableCollection 时不更新 DataGrid

C# - 通过网络序列化数据包

c# - Socket.Send,服务器收到很多无效的 MPacket

c# - 在 CQRS 模式中,应该在域服务或命令处理程序中工作

c# - 如何将多个异步方法设置到队列中?