c# - 引用列表项构造 C# Lambda 表达式

标签 c# lambda

我需要构造一个动态 lambda 表达式,例如:m => m.Data[0].Name

我有模型类:

public class GridItem
{
    [Required]
    [Display(Name = "Name")]
    public string Name{ get; set; }

    [Required]
    [Display(Name = "Address")]
    public string Password { get; set; }

    [Display(Name = "Age")]
    public string Age{ get; set; }
}

public class GridModelList
{
    public List<GridItem> Data { get; set; }

    public GridModelList()
    {
        Data = new List<GridItem>();
        Data.Add(new GridItem() {Name = "Name", Address= "Address", Age= 1 });
        Data.Add(new GridItem() {Name = "Name", Address= "Address", Age= 1 });
    }
}

我正在尝试像这样构造它:

ParameterExpression fieldName = Expression.Parameter(typeof(TGridModel), "m");
MemberExpression fieldExpr = Expression.Property(fieldName, "m.Data.getItem(0).Name");
Expression<Func<TGridModel, object>> exp = Expression.Lambda<Func<TGridModel, object>>(fieldExpr, fieldName);

但是,我的问题是我不知道如何正确使用“.getItem(0)”,因为它给了我异常:

Instance property 'Data.get_Item(0).Name' is not defined for type 'GridModelList'

任何关于如何构建所需表达式m => m.Data[0].Name的帮助将不胜感激!!

最佳答案

您需要使用Expression.Property for index property像这样

ParameterExpression fieldName = Expression.Parameter(typeof(TGridModel), "m");

var fieldDataExpr = Expression.Property(fieldName, "Data");
var fieldExpr = Expression.Property(fieldDataExpr, "Item", Expression.Constant(0));
var fieldNameExpr = Expression.Property(fieldExpr, "Name");

然后

Expression<Func<TGridModel, object>> exp = Expression.Lambda<Func<TGridModel, object>>(fieldNameExpr, fieldName);

关于c# - 引用列表项构造 C# Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22937489/

相关文章:

c# - 如果用户在控件加载到 wpf c# 中的 GridSplitter 内的列/行内之前更改它,如何更改 gridsplitter 的位置

c# - 带条件搜索的 Lambda 表达式,仅返回 1 个最新结果

c++ - 如何通过捕获在函数中传递 lambda?

C# 表达式语法速记

c# - 使用 lambda 语法与匿名类型进行多个 linq 连接

java - 为什么编译时不检查 lambda 返回类型?

c# - 屏幕 WorkingArea 的总和与其 Bounds 有什么区别

c# - 使用 Process.Start() 打开多个文档

c# - 我们可以在 Mac OS X 上运行 C#/WPF 应用程序吗?

c# - 从 .Net v4.5 升级到 .Net v4.5.2 后未声明元素验证错误