У меня есть выражение , которое используется для получения списка элементов. из моей
Модели
для моего Вида.
То, что я хочу сделать, дано Expression
для List
, могу ли я вернуться назад вверх по дереву выражений
на один уровень, чтобы получить родительский узел?
Допустим, это моя модель представления:
public class MyModel {
public MyClass myClass { get; set;}
}
...
public class MyClass {
public List<string> MyList { get; set;}
}
У меня есть HtmlHelper
, который принимает Expression
следующим образом для отображения списка на странице:
public static MvcHtmlString RenderList(this HtmlHelper<TModel> html, Expression<Func<TModel, IEnumerable<TItem>>> dataExpression)
{
var list = dataExpression.Compile()(html.ViewData.Model);
...
return MvcHtmlString.Create(...);
}
Я вызываю своего помощника следующим образом:
@model MyNamespace.Models.MyModel
@Html.RenderList(m => m.myClass.MyList)
Все работает нормально, мой вопрос в том, могу ли я взять заданное Выражение
, которое указывает на Список<строка>
и получить это родительский узел ( MyClass
), затем скомпилируйте его с моей Model
, чтобы получить его значение. Таким образом, эквивалент этого Выражение
:
m => m.myClass
Вот что я пробовал:
// This gets the correct expression
var exp = ((MemberExpression)this._dataExpression.Body).Expression;
// Create a parameter representing the type of the Model ?
var parameter = Expression.Parameter(typeof(TModel));
// Create lambda
var lambda = Expression.Lambda<Func<TModel, dynamic>>(exp, parameter);
// Try and compile against the view model
var obj = lambda.Compile()(html.ViewData.Model);