C# Linq表达式到字符串
这里有一个MVC中转换为html标记的简单方法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表达式相关的 先谢谢你 这与
@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