编写强类型的 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;
}
从第一眼看,它们都有不同的实现(使用反射器进行调查),但我没有深入研究。
我坚持了很多解决问题的方法,想知道哪种解决方案更适合不同的情况,为什么?
我将不胜感激任何帮助