Asp.net mvc expression.Compile()vs modelmetada.FromLambdaExpression

Asp.net mvc expression.Compile()vs modelmetada.FromLambdaExpression,asp.net-mvc,lambda,modelmetadata,Asp.net Mvc,Lambda,Modelmetadata,编写强类型Html助手有一个常见问题。 问题是如何检索属性名/值对。 假设我们有以下Html助手声明: public static string DatePickerFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> expression) 二, 三,。仅使用MemberExpression获取成员名 string GetProperty

编写强类型Html助手有一个常见问题。 问题是如何检索属性名/值对。 假设我们有以下Html助手声明:

public static string DatePickerFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> expression) 
二,

三,。仅使用MemberExpression获取成员名

string GetPropertyName<T>(Expression<Func<T>> property)
{
    var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo;
    if (propertyInfo == null)
    {
        throw new ArgumentException("The lambda expression 'property' should point to a valid Property");
    }
    return propertyInfo.Name;
}
string GetPropertyName(表达式属性)
{
var propertyInfo=(property.Body作为MemberExpression.Member作为propertyInfo;
如果(propertyInfo==null)
{
抛出新ArgumentException(“lambda表达式'property'应指向有效的属性”);
}
返回propertyInfo.Name;
}
所有这些都有不同于第一次查看(使用Reflector进行调查)的实现,但我没有深入研究

我坚持用很多方法来解决这个问题,我想知道哪种解决方案更适合不同的情况,为什么


如果有任何帮助,我将不胜感激。

这些解决方案用于两种不同的环境

1) 视图使用它来正确地为html字段添加前缀,为模型绑定做准备,并且几乎与ModelMetadata无关。如果需要生成子表单,此代码将提供“Customer.Addresses[0].City”

此方法只关心PropertyInfo.Name。这永远不会给出
[DisplayName]
属性的内容


2) 主要用于处理Modelmetadata。我99%的时候会使用方法二,除非你需要解#1。这还将获取与DataAnnotations属性关联的元数据。这是
[DisplayName]
的内容,谢谢。你知道“值”变量的不同方法有什么不同吗?也许在某些情况下会有一些性能优势?
ModelMetadata metadata = ModelMetadata.FromLambdaExpression( expression, helper.ViewData );
Object value = metadata.Model;
String name = metadata.PropertyName;
string GetPropertyName<T>(Expression<Func<T>> property)
{
    var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo;
    if (propertyInfo == null)
    {
        throw new ArgumentException("The lambda expression 'property' should point to a valid Property");
    }
    return propertyInfo.Name;
}