Qual é a maneira mais fácil de obter o valor da propriedade de uma expressão lambda passada em um método de extensão para HtmlHelper?

Estou escrevendo um método de extensão pequeno e sujo para HtmlHelper, para que eu possa dizer algo como HtmlHelper.WysiwygFor (lambda) e exibir o CKEditor.

Eu tenho esse trabalho atualmente, mas parece um pouco mais complicado do que eu preferiria. Espero que exista uma maneira mais direta de fazer isso.

Aqui está o que eu tenho até agora.

public static MvcHtmlString WysiwygFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
    return MvcHtmlString.Create(string.Concat("<textarea class=\"ckeditor\" cols=\"80\" id=\"",
                                        expression.MemberName(), "\" name=\"editor1\" rows=\"10\">", 
                                        GetValue(helper, expression),
                                        "</textarea>"));
}

private static string GetValue<TModel, TProperty>(HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
    MemberExpression body = (MemberExpression)expression.Body;
    string propertyName = body.Member.Name;
    TModel model = helper.ViewData.Model;
    string value = typeof(TModel).GetProperty(propertyName).GetValue(model, null).ToString();
    return value;
}

private static string MemberName<T, V>(this Expression<Func<T, V>> expression)
{
    var memberExpression = expression.Body as MemberExpression;
    if (memberExpression == null)
            throw new InvalidOperationException("Expression must be a member expression");

    return memberExpression.Member.Name;
}

Obrigado!

questionAnswers(6)

yourAnswerToTheQuestion