代码之家  ›  专栏  ›  技术社区  ›  Cheburek

expression.compile()与modelmetadata.fromlambdaexpression

  •  7
  • Cheburek  · 技术社区  · 15 年前

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

    三。仅使用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;
    }
    

    它们的实现都与第一个外观不同(使用反射镜进行研究),但我没有深入研究。

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

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

    1 回复  |  直到 15 年前
        1
  •  3
  •   John Farrell    15 年前

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

    1)用于视图在准备模型绑定时正确地为HTML字段加前缀,几乎与ModelMetadata无关。此代码将提供“customer.addresses[0].city”,以备需要执行子表单时使用。

    此方法只关心propertyinfo.name。这永远不会给你一个 [DisplayName] 属性。

    2)主要用于使用ModelMetadata。我会使用方法2 99%的时间,除非你需要解决1。这还将获取与dataAnnotations属性关联的元数据。这个窗台给你的内容是 [显示名称] .

    推荐文章