expressy.compile()vs modelmetadata.fromlambdaexpression
-
08-10-2019 - |
题
编写强大的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;
}
所有这些都具有与第一眼不同的实现(用于调查的反射器)不同,但我没有深入研究。
我一直坚持解决问题的多种方法,并想知道哪种解决方案在不同的情况下更好,为什么?
我会感谢任何帮助
解决方案
这些解决方案用于两个不同的上下文。
1)视图用来正确前缀HTML字段以准备模型结合,并且与ModelMetadata几乎无关。如果您需要执行子表单,则此代码将提供“ customer.addresses [0] .City”。
此方法仅关心propertyInfo.name。这将永远不会给您带来的内容 [DisplayName]
属性。
2)主要用于使用ModelMetadata。我将使用方法两次99%的时间,除非您需要解决#1。这也将使元数据与数据通道属性关联。这个门槛为您提供了 [DisplayName]
.
不隶属于 StackOverflow