繁体   English   中英

使用反射对多个属性进行 GroupBy 动态列表

[英]GroupBy dynamic list on multiple properties by using reflection

我有一个 class 定义了一些设置,其中一个设置是对要分组的列表进行分组的属性:

object 的 class 我的设置

MySetting setting = new()
{
 Groupby = $"{nameof(MyCss.Color)}, {nameof(MyCss.Width)}",
 //.....
}

现在我有一个动态列表,我想将此列表作为参数发送给 ApplySetting 之类的方法, settingApplySetting ,此方法必须检查Groupby是否不是 null 并将我的列表分组:

public ApplySetting(List<TItem> myList, MySetting setting)
{
  if(setting.Groupby != null)
  {
   var arr = setting.Groupby.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList();
    //do some this like, this wrong !
    var groubs = myList.GroupBy(x => arr.ForEach(y => GetPropertyValue(y, x, x.GetType())))
   
  }
}

注意: GetPropertyValue是一种使用反射从 object 中获取值的方法。
谢谢你的帮助。

这不是您要求的反思解决方案,而是破解,但也许它可以为您服务。 它使用 lib System.Linq.Dynamic.Core 并将列表转换为可查询。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
        
public class MySetting {
    public string Groupby {get; set;}
}

public class ToGroupType{
    public string Color {get; set;}
    public string Width {get; set;}
}

public class Program
{
    public static void Main()
    {
        MySetting setting = new()
        {
         Groupby = $"Color, Width",
         //.....
        };
         static void  ApplySetting<TItem>(List<TItem> myList, MySetting setting)
        {
          if(setting.Groupby != null)
          {
           //do some this like, this wrong !
            var groubs = myList.AsQueryable().GroupBy($"new ({setting.Groupby})", "it").Select($"new (it.Key as Key , Count() as Count)").ToDynamicList();
            Console.WriteLine(string.Join(",", groubs));
            //result:  Key = { Color = Red, Width = 10 }, Count = 2 },{ Key = { Color = Blue, Width = 10 }, Count = 2 },{ Key = { Color = Blue, Width = 15 }, Count = 1 }
          }
        }
        ApplySetting(new List<ToGroupType>(){
            new ToGroupType{Color = "Red", Width="10"},
            new ToGroupType{Color = "Red", Width="10"},
            new ToGroupType{Color = "Blue", Width="10"},
            new ToGroupType{Color = "Blue", Width="10"},
            new ToGroupType{Color = "Blue", Width="15"},
            
        }, setting);
}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM