Linq Expression to String

时间:2014-12-16 18:34:30

标签: c# linq lambda

这是MVC中一个转换为html标签的简单方法。

@Html.HiddenFor(model => model.myName);

将其转换为以下html。

<input type="hidden" name="myName" value="ABC..." />

如何将此表达式转换为字符串。让我们假设如果我想编写这种方法,我怎么知道属性名称及其值。假设来自HiddenFor参数,myName&amp; myName值将被提取。 这不是MVC特有的,但与LINQ表达式有关。

提前多多感谢。

3 个答案:

答案 0 :(得分:6)

这与LINQ无关(除了LINQ大量使用那些&#34;表达式树&#34;)。

model => model.MyProperty是一个lambda表达式,当被视为Expression<Func<Model, T>>而不仅仅是Func<Model, T>时,可以解析

让我以一个(大多是不言自明的)例子回答你的问题:

public static string GetPropertyName<T>(Expression<Func<Model, T>> expr)
{
    var member = (MemberExpression)expr.Body;
    var property = (PropertyInfo)member.Member;
    return property.Name;
}

可以按如下方式使用:

public class Model
{
    public int MyProperty { get; set; }
}

static void Main(string[] args)
{
    // Prints "MyProperty"
    Console.WriteLine(GetPropertyName(model => model.MyProperty));
}

答案 1 :(得分:2)

查看Mvc源代码中的ExpressionHelper类

https://github.com/aspnet/Mvc/blob/9c545aa343ccb1bf413888573c398fe56017d9ee/src/Microsoft.AspNet.Mvc.Core/Rendering/Expressions/ExpressionHelper.cs

方法GetExpressionText转换有问题的lambda表达式

答案 2 :(得分:1)

解析表达式很难。我有同样的问题,有一个更简单的解决方案。

虽然它不那么优雅,但它快速,简单,简短,处理子类

Expression.Body.ToString()实际上可以工作并将整个表达式作为字符串返回。最艰难的工作是在之后处理字符串:

class Program
{
    public class Car
    {
        public int Id;
        public CarModel Model;
        public string Owner ;
    }
    public class CarModel
    {
        public string Name;
        public string Brand;
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(ExpToString(x => x.Id));
        Console.WriteLine(ExpToString(x => x.Owner));
        Console.WriteLine(ExpToString(x => x.Model));
        Console.WriteLine(ExpToString(x => x.Model.Name));
        Console.WriteLine(ExpToString(x => x.Model.Brand));
    }

    // The inelegant solution that works
    public static string ExpToString<T>(Expression<Func<Car, T>> exp)
    {
        var s = exp.Body.ToString();
        return s.Remove(0, s.IndexOf('.') + 1);
    }
}

输出:

Id
Owner
Model
Model.Name
Model.Brand

我实际上在WinForms中使用它来进行数据绑定初始化,我对它非常满意。