从 lambda 表达式访问属性的 HtmlHelper 方法之间的区别
Difference between HtmlHelper methods for accessing properties from lambda expression
我正在尝试编写我的第一个客户 Html Helper 扩展方法,格式如下
public static MvcHtmlString<TModel, TProperty>
MyHelperFor(this HtmlHelper<TModel> helper,
Expression<Func<TModel, TProperty>> expression)
似乎有几种不同的方法可以从 expression
访问 属性 名称和值
var body = expression.Body as MemberExpression;
var propertyName = body.Member.Name;
var propertyInfo = typeof(TModel).getProperty(propertyName)
var propertyValue = propertyInfo.GetValue(helper.ViewData.Model);
和
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var propertyName = metadata.PropertyName;
var propertyValue = metadata.Model;
还有
TModel model = (TModel)helper.ViewContext.ViewData.ModelMetadata.Model;
TProperty value = expression.Compile().Invoke(model);
有人可以解释一下这些方法之间的区别吗?有没有比其他人优越的情况?
这是 3 种不同的利用方式 Expression<Func<TModel, TProperty>>
。他们都将提供对 属性 值的访问权限。它们在访问表达式树的其余部分和处理 cost/efficiency.
方面有所不同
使用 expression.Compile().Invoke(model)
在您的模型上像函数一样执行表达式 :: ( u => u.name)
。
TModel model = (TModel)helper.ViewContext.ViewData.ModelMetadata.Model;
TProperty value = expression.Compile().Invoke(model);
您将得到 属性 或 list<property>
。当您只想执行表达式并继续前进时,它是最有效的。
ModelMetadata.FromLambdaExpression 使用 Expression<Func<TParameter, TValue>>
类型的表达式作为 DataDictionary
查找。
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var propertyName = metadata.PropertyName;
var propertyValue = metadata.Model;
这种方法更冗长且效率较低,但您可以访问 属性 value 和 name.
请注意,ModelMetadata 还允许您访问模型的注释值,例如 Validators 和 DisplayName.
MemberExpression 使用表达式访问字段 / 属性 并且它是类型。
var body = expression.Body as MemberExpression;
var propertyName = body.Member.Name;
var propertyInfo = typeof(TModel).getProperty(propertyName)
var propertyValue = propertyInfo.GetValue(helper.ViewData.Model);
这种方法最冗长且效率最低,但你会得到 value、name 和 属性类型.
MemberExpression.Member 属性 授予访问权限 CustomAttributes
我正在尝试编写我的第一个客户 Html Helper 扩展方法,格式如下
public static MvcHtmlString<TModel, TProperty>
MyHelperFor(this HtmlHelper<TModel> helper,
Expression<Func<TModel, TProperty>> expression)
似乎有几种不同的方法可以从 expression
var body = expression.Body as MemberExpression;
var propertyName = body.Member.Name;
var propertyInfo = typeof(TModel).getProperty(propertyName)
var propertyValue = propertyInfo.GetValue(helper.ViewData.Model);
和
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var propertyName = metadata.PropertyName;
var propertyValue = metadata.Model;
还有
TModel model = (TModel)helper.ViewContext.ViewData.ModelMetadata.Model;
TProperty value = expression.Compile().Invoke(model);
有人可以解释一下这些方法之间的区别吗?有没有比其他人优越的情况?
这是 3 种不同的利用方式 Expression<Func<TModel, TProperty>>
。他们都将提供对 属性 值的访问权限。它们在访问表达式树的其余部分和处理 cost/efficiency.
使用 expression.Compile().Invoke(model)
在您的模型上像函数一样执行表达式 :: ( u => u.name)
。
TModel model = (TModel)helper.ViewContext.ViewData.ModelMetadata.Model;
TProperty value = expression.Compile().Invoke(model);
您将得到 属性 或 list<property>
。当您只想执行表达式并继续前进时,它是最有效的。
ModelMetadata.FromLambdaExpression 使用 Expression<Func<TParameter, TValue>>
类型的表达式作为 DataDictionary
查找。
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var propertyName = metadata.PropertyName;
var propertyValue = metadata.Model;
这种方法更冗长且效率较低,但您可以访问 属性 value 和 name.
请注意,ModelMetadata 还允许您访问模型的注释值,例如 Validators 和 DisplayName.
MemberExpression 使用表达式访问字段 / 属性 并且它是类型。
var body = expression.Body as MemberExpression;
var propertyName = body.Member.Name;
var propertyInfo = typeof(TModel).getProperty(propertyName)
var propertyValue = propertyInfo.GetValue(helper.ViewData.Model);
这种方法最冗长且效率最低,但你会得到 value、name 和 属性类型.
MemberExpression.Member 属性 授予访问权限 CustomAttributes