0

所以我想创建一个 MVC 帮助器,用户可以在其中传递表达式集合和集合以从中提取这些值。这将创建一个包含列名称的表,然后是这些列的值列表。

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>>,但不确定如何为列表编写 select 语句。这应该可以获取值:

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

因此,使用这种技术已经成为我的核心库的一部分已有一段时间了,我想出了这个来允许简单的格式化:

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; }

    }
4

0 回答 0