使用表达式列表从IEnumerable <t>中选择属性值?</t>

时间:2013-10-09 21:36:01

标签: c# asp.net-mvc lambda

所以我想创建一个MVC帮助器,用户可以传入一组表达式和集合来从中提取这些值。这将创建一个包含列Names的表,然后创建这些列的值列表。

public class ColumnDefinition<T> where T: class 
    {
        public Expression<Func<T,object>> Property { get; set; }
        public string DisplayName { get; set; }
        public string DefaultValue { get; set; }       
        public bool IsVisisble { get; set; }
        public string CssClass { get; set; }

    }

所以助手可能看起来像这样:

public static IHtmlString ToTable<T>(this HtmlHelper helper, IEnumerable<T> list, IEnumberable<ColumnDefinition<T>> columnDefs) where T: class
{
....
}

我知道如何从Expression<Func<T,object>>获取属性名称,但不知道如何为列表选择声明。这应该有助于获得价值:

var someList= list.Select(() => columnDefs.Select(c => c.Property)).ToList();

我正在尝试弄清楚如何将名称与值对齐。所以一个例子可能是这样的:

var colDef = new List<ColumnDefinition<Foo>>()
            {
                new ColumnDefinition<Foo>()
                {
                    Property = f => f.Id,
                    DisplayName = "Foo"
                },
                new ColumnDefinition<Foo>()
                {
                    Property = f => f.Bar.Name,                    
                }
            } 

所以当这组列定义传递给帮助器时,我想获取所有的属性名称,除非DisplayName存在(我知道如何获取名称)然后我想为每一个写入数据那些列定义。

更新

所以到目前为止我有这个:

public static class DataTablesHelper
    {
        public static DataTableModel GnerateColumns<T>(IEnumerable<T> list,
            IEnumerable<ColumnDefinition<T>> columnDefinitions) where T: class
        {
            foreach (var o in list)
            {
                var newList = GetInfo(o, columnDefinitions.ToList());
            }

            return new DataTableModel();
        }

        private static List<string> GetInfo<T>(T source, IEnumerable<ColumnDefinition<T>> columnDefinitions) where T : class
        {
            return columnDefinitions.Select(columnDefinition => columnDefinition.Property(source).ToString()).ToList();
        }
    }




    public class ColumnDefinition<T> where T: class 
    {
        public Func<T,object> Property { get; set; }
        public string DisplayName { get; set; }
        public string Value { get; set; }
        public string SortValue { get; set; }
        public bool IsVisisble { get; set; }
        public string CssClass { get; set; }

    }

这似乎有助于获取值,我可以稍后获取属性名称。理想情况下,传入字符串格式化器来格式化输出会很不错。

更新2

所以,使用this技术已经成为我的核心库的一部分了一段时间,我提出了这个以允许简单的格式化:

private static List<string> GetInfo<T>(T source, IEnumerable<ColumnDefinition<T>> columnDefinitions) where T : class
        {
            var listValues = new List<string>();
            foreach (var columnDefinition in columnDefinitions.ToList())
            {
                var prop = columnDefinition.Property(source);
                var definition = columnDefinition;
                TypeSwitch.Do(prop, TypeSwitch.Case<DateTime>(p => listValues.Add(p.ToString(definition.Format))),
                    TypeSwitch.Default(() => listValues.Add(prop.ToString())));
            }

            return listValues;
        }

我添加了一个包含格式化程序的字符串。

public class ColumnDefinition<T> where T: class 
    {
        public Func<T,object> Property { get; set; }
        public string Format { get; set; }
        public string DisplayName { get; set; }
        public string Value { get; set; }
        public string SortValue { get; set; }
        public bool IsVisisble { get; set; }
        public string CssClass { get; set; }

    }

0 个答案:

没有答案