这是MVC中一个转换为html标签的简单方法。
@Html.HiddenFor(model => model.myName);
将其转换为以下html。
<input type="hidden" name="myName" value="ABC..." />
如何将此表达式转换为字符串。让我们假设如果我想编写这种方法,我怎么知道属性名称及其值。假设来自HiddenFor参数,myName&amp; myName值将被提取。 这不是MVC特有的,但与LINQ表达式有关。
提前多多感谢。
答案 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类
方法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中使用它来进行数据绑定初始化,我对它非常满意。