表达式.Compile()与ModelMetadata.FromLambdaExpression

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

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

我发现了几种解决方案:1。

var value = expression.Compile()( helper.ViewData.Model );
string name = ExpressionHelper.GetExpressionText( expression );
string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName( name );

2。

ModelMetadata metadata = ModelMetadata.FromLambdaExpression( expression, helper.ViewData );
Object value = metadata.Model;
String name = metadata.PropertyName;

3.仅使用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;
}

从第一眼看来,它们都有不同的实现(用Reflector来调查),但我没有深入研究。

我坚持用这么多方式来解决问题,并想知道哪种解决方案对于不同情况更好,为什么?

我会很感激的任何帮助


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

1)视图使用正确的HTML字段前缀来准备模型绑定,并且与ModelMetadata几乎没有关系。 如果您需要执行子表单,此代码将提供“Customer.Addresses [0] .City”。

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

2)主要用于处理Modelmetadata的是什么。 除非你需要解决#1,否则我会在99%的时间使用方法2。 这也将获得与DataAnnotations属性关联的元数据。 这个窗台为您提供[DisplayName]的内容。

链接地址: http://www.djcxy.com/p/3179.html

上一篇: expression.Compile() vs ModelMetadata.FromLambdaExpression

下一篇: How can I get App::cpanminus to work?