expression.Compile () vs ModelMetadata.FromLambdaExpression

Существует распространенная проблема при написании строго типизированных помощников 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;
}

Все они имеют разные реализации, чем на первый взгляд (для исследования использовался Reflector), но я не стал вдаваться в подробности.

Я использовал так много способов решения проблемы и хотел бы хотели бы знать, какое решение ЛУЧШЕ для разных ситуаций и ПОЧЕМУ?

Буду признателен за любую помощь

7
задан Justin Johnson 19 October 2010 в 17:07
поделиться