简体   繁体   中英

GroupBy dynamic list on multiple properties by using reflection

I have a class that defines some settings, one of this settings are the properties to group the list that you want to group by:

object of class MySetting

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

Now I have a dynamic list and I want to send this list as parameter with object setting to a method like ApplySetting , this method has to check if Groupby not a null and group my list:

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())))
   
  }
}

Note: GetPropertyValue is a method that get value from object by using reflection.
Thanks for any help.

This is not solution with reflection you asked for but hack, but maybe it can serve you. It uses lib System.Linq.Dynamic.Core and converts list to Queriable.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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