Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq表达式到字符串_C#_Linq_Lambda - Fatal编程技术网

C# Linq表达式到字符串

C# Linq表达式到字符串,c#,linq,lambda,C#,Linq,Lambda,这里有一个MVC中转换为html标记的简单方法 @Html.HiddenFor(model => model.myName); 这将转换为下面的html <input type="hidden" name="myName" value="ABC..." /> 如何将此表达式转换为字符串。假设如果我想写这种方法,我怎么知道属性名及其值呢。假设从HiddenFor参数中,将如何提取myName和myName值。 这不是MVC特有的,而是与LINQ表达式相关的 先谢谢你 这与

这里有一个MVC中转换为html标记的简单方法

@Html.HiddenFor(model => model.myName);
这将转换为下面的html

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

如何将此表达式转换为字符串。假设如果我想写这种方法,我怎么知道属性名及其值呢。假设从HiddenFor参数中,将如何提取myName和myName值。 这不是MVC特有的,而是与LINQ表达式相关的


先谢谢你

这与LINQ无关(除了LINQ大量使用那些“表达式树”)

model=>model.MyProperty
是一个lambda表达式,当将其视为
表达式时,可以对其进行解析,而不仅仅是
Func

让我用一个(大部分是不言自明的)例子来回答你的问题:


查看Mvc源代码中的ExpressionHelper类


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

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

虽然它没有那么优雅,但它快速、简单、简短,并且它处理子类

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);
    }
}

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

这是一个非常广泛的主题,太广泛了,无法在一个简单的答案中解释。您可以查阅
Expression
的文档,查看它公开了哪些信息,还可以找到许多关于如何在SO和其他地方解析表达式的信息。您可以查看mvc的源代码(和输入扩展)这里:为什么这个问题被否决?你能告诉我在MVC架构中@Html.HiddenFor的模板类型是在哪里定义的吗。称为TModel&TProperty的模板类型。泛型类型参数由编译器推断。不需要显式地指定它们。谢谢Jonas,很抱歉响应太晚,但到目前为止我搜索的是泛型类型无法自动推断,所以它是特定于MVC的吗?我仍然不明白mvc中如何推断泛型类型,为什么不在任何简单的控制台应用程序中推断泛型类型?这通常适用于C。Heinzi答案中的代码示例适用于任何项目类型。这是我在尝试运行Heinzi示例代码时得到的结果。无法从用法推断方法“LinqPractice.Program.GetPropertyName(System.Linq.Expressions.Expression)”的类型参数。尝试显式指定类型参数。您在哪里为GetPropertyName函数定义了Model&T类型,以及Html.HiddenFor在不定义TModel&TProperty的情况下是如何工作的?
public class Model
{
    public int MyProperty { get; set; }
}

static void Main(string[] args)
{
    // Prints "MyProperty"
    Console.WriteLine(GetPropertyName(model => model.MyProperty));
}
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