【问题标题】:How can extract Custom Property value from lambda expression?如何从 lambda 表达式中提取自定义属性值?
【发布时间】:2021-07-02 16:37:59
【问题描述】:

我有以下类定义

Person.cs

class Person {

  [Column("first_name")]
  public string FirstName { get; set; }

  [Column("last_name")]
  public string LastName { get; set; }
}

我编写了一个 HTML Helper 扩展来从给定实例中提取 ColumnAttribute 值。但是,它并没有像我预期的那样工作。

这是我尝试过的:

Index.cshtml

@model Person
<p>ColumnName is @Html.ColumnNameFor( model => model.FirstName )</p>

HtmlExtensions.cs(公共静态类)

public static string ColumnNameFor<T, P>(this HtmlHelper<T> helper, Expression<Func<T, P>> expression)
{
    var name = ExpressionHelper.GetExpressionText(expression);
    var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);

    // this line causes a runtime error:
    //  Sequence contains no elements
    var attr = (ColumnAttribute)metadata.GetType().GetCustomAttributes(typeof(ColumnAttribute), false).First();
            
  return attr.Name;    // ColumnAttribute stores the value in .Name
}

作为记录,我可以使用GetCustomAttributes 提取值,前提是我传递了对该属性的引用,我认为这会使视图中的代码看起来与内置的 ASP MVC 代码非常不同Html.TextBoxForHtml.DisplayFor

【问题讨论】:

    标签: c# asp.net-mvc lambda reflection


    【解决方案1】:

    感谢@benuto 的回答,我能够了解如何使用MemeberExpress 提取任何必需的自定义属性或属性。我希望答案可以帮助其他人,所以我做了一个工作示例。请记住,您需要检查对象是否具有自定义属性,以避免在访问 FirstOrDefault().Name 时崩溃。

     public static string ColumnNameFor<T, P>( this HtmlHelper<T> helper, 
                                               Expression<Func<T, P>> expression)
     {
          var name = ExpressionHelper.GetExpressionText(expression);
    
          MemberExpression me = expression.Body as MemberExpression;
    
          var cp = (ColumnAttribute)me
                      .Member
                      .GetCustomAttributes(typeof(ColumnAttribute), false)
                      .FirstOrDefault();
    
          return (cp == null) ? null : cp.Name;
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2016-07-14
      相关资源
      最近更新 更多