首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >expression.Compile() vs ModelMetadata.FromLambdaExpression

expression.Compile() vs ModelMetadata.FromLambdaExpression
EN

Stack Overflow用户
提问于 2010-10-17 21:59:23
回答 1查看 2.5K关注 0票数 7

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

代码语言:javascript
复制
public static string DatePickerFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> expression) 

我找到了几个解决方案: 1.

代码语言:javascript
复制
var value = expression.Compile()( helper.ViewData.Model );
string name = ExpressionHelper.GetExpressionText( expression );
string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName( name );

2.

代码语言:javascript
复制
ModelMetadata metadata = ModelMetadata.FromLambdaExpression( expression, helper.ViewData );
Object value = metadata.Model;
String name = metadata.PropertyName;

仅使用MemberExpression获取成员名称的

代码语言:javascript
复制
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来研究),但我并没有深入研究。

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

我将非常感谢您的任何帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-17 23:18:37

这些解决方案用于两种不同的上下文。

1)被视图用来为html字段添加适当的前缀以准备模型绑定,并且几乎与ModelMetadata无关。此代码将提供"Customer.Addresses.City“,以备您需要执行子窗体时使用。

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

2)主要用于处理模型元数据。我会使用方法2 99%的时间,除非你需要解决#1。这也会得到与DataAnnotations属性相关的元数据。这将为您提供[DisplayName]的内容。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3953525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档