泛型 - 获取属性 LINQ

Generics - get properties LINQ

我有这个class:

  private void Get_properties<T>(ObservableCollection<T> collection)
  {

     List<string> longest_values = new List<string>(); 

     var properties = typeof(T).GetProperties();

     foreach (var prop in properties)
     {
        var prop_value = collection.OrderByDescending(y=> prop.GetValue(y,null)).FirstOrDefault();
   
        longest_values.Add(prop_value);
      }

      //Now I want to do something with this List
      foreach (var item in longest_values)
      {
         //..
      }

    }

我试图通过 LINQ 查找集合中具有最长字符串值的每个 属性 的值。我该怎么做?

由于 prop_value 是一个 object,您使用单个值调用 string.Join(string, parm object[]),这相当于;

Console.WriteLine(prop_value?.ToString());

默认ToString()方法returns对象的类型名称。

更新

这将为您提供“每个项目所有属性的最长字符串中的第一个

或者换个说法。这将遍历通用列表,获取所有属性及其值(其中为字符串),然后获取第一个值(按长度降序排列)

var result = typeof(T)
   .GetProperties()
   .Where(x => x.PropertyType == typeof(string))
   .Select(prop => collection
      .Select(y => (string) prop.GetValue(y, null))
      .OrderByDescending(z => z.Length)
      .FirstOrDefault())
   .ToList();

foreach (var item in result)
   Console.WriteLine(item);

原创

我认为您在 OrderByDescending 上稍微偏离了轨道,您可能想要 Select 然后 orderby 或 orderby 然后 select?无论哪种方式,这都会为您提供列表中每个对象的属性值列表

var properties = typeof(T).GetProperties();

foreach (var prop in properties)
{
   var prop_values = collection.Select(y => prop.GetValue(y, null));
   Console.WriteLine(string.Join(",", prop_values)); 
}