Powszechnie pojawia się problem polegający na pisaniu mocno napisanych helperów HTML. Problem polega na tym, jak pobrać parę nazwa/wartość właściwości. że mamy następujący kod HTML deklaracji pomocnika:expression.Compile() vs ModelMetadata.FromLambdaExpression
public static string DatePickerFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> expression)
Istnieje kilka rozwiązań znalazłem: 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. uzyskiwanie nazwy użytkownika tylko przy użyciu 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;
}
Wszystkie one mają różną implementację od pierwszego spojrzenia (użył reflektora do zbadania), ale nie zagłębiłem się głęboko.
Utknąłem na tyle sposobów, aby rozwiązać problem i chciałbym wiedzieć, które rozwiązanie jest LEPSZE dla różnych sytuacji i DLACZEGO?
Będę wdzięczni za wszelką pomoc
Dziękuję. Czy wiesz, że jest jakaś różnica w różnych podejściach dla zmiennych "wartości"? Może niektóre korzyści wydajności w niektórych przypadkach? – Cheburek