expression.Compile() 与 ModelMetadata.FromLambdaExpression

Posted

技术标签:

【中文标题】expression.Compile() 与 ModelMetadata.FromLambdaExpression【英文标题】:expression.Compile() vs ModelMetadata.FromLambdaExpression 【发布时间】:2011-04-26 14:16:25 【问题描述】:

编写强类型 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】:

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

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

这个方法只关心PropertyInfo.Name。这永远不会为您提供[DisplayName] 属性的内容。

2) 主要用于处理 Modelmetadata。除非您需要解决#1,否则我会在 99% 的时间使用方法二。这还将获取与 DataAnnotations 属性关联的元数据。这栏给你[DisplayName]的内容。

【讨论】:

谢谢。你知道“价值”变量的不同方法有什么区别吗?在某些情况下可能会带来一些性能优势?

以上是关于expression.Compile() 与 ModelMetadata.FromLambdaExpression的主要内容,如果未能解决你的问题,请参考以下文章

motionbuilder 与maya的问题 求解..

关于操作系统中英文切换的.po和.mo介绍

莫队算法Mo's algorithm

.Mo翻译文件结构解析

022cr18nl14mo3是啥材料

Android M MO流程并与Android L MO对比