为通用对象创建Lambda表达式

时间:2017-02-07 09:40:23

标签: c# .net expression expression-trees

我需要从我的模型中创建Expression<Func<TModel, TValue>>

如何访问模型中的属性:

ViewModel.CustomFieldCollection[1].PrimaryFields[3].Value

其中1&amp; 3是将在运行时更新的索引。

我正在尝试创建一个表达式,传递给HtmlHelper,为我生成一个HtmlString。

var viewModelExpParam = Expression.Parameter(typeof(ViewModel));

var fieldParam = Expression.Property(viewModelExpParam, "CustomFieldCollection[1]");

var expression = Expression.Lambda<Func<TModel, TValue>>(fieldParam, viewModelExpParam);

但上面的代码在创建fieldParam时会出错,因为它不是对象而是集合对象。

我可以在运行时生成一个表达式来访问HtmlHelper中的ViewModel.CustomFieldCollection[1].PrimaryFields[3].Value吗?

1 个答案:

答案 0 :(得分:2)

您可以通过Item属性访问indexxed成员(它只是一个示例代码,我还没有尝试过,您还没有为它提供任何代码:)) :

var customFieldCollection = Expression.Property(viewModelExpParam,"CustomFieldCollection");
var fieldParam = Expression.Property(customFieldCollection , "Item", 
                         new Expression[] { Expression.Constant(1) });

而不是:

var primaryFields = Expression.Property(fieldParam,"PrimaryFields");
var primaryFieldItem = Expression.Property(primaryFields , "Item", 
                             new Expression[] { Expression.Constant(3) });
var value = Expression.Property(primaryFieldItem, "Value");

var expression = Expression.Lambda<Func<TModel, TValue>>(value,  viewModelExpParam);