如何使例程处理泛型类实例的可观察集合

本文关键字:观察 集合 实例 泛型类 何使 例程 处理 | 更新日期: 2023-09-27 18:28:25

我想制作一个记录器(在库中),它遍历任何类的每个字段,并在逗号分隔的值行中设置所有值。它的输入值是任何类的可观察集合。为了让它通用,我把它做成了

ObservableCollection newObcObject。

public static bool WriteLog_Reflection(string fileName, long maxLogSizeMB, ObservableCollection<object>newObcObject, out string strError)
{
  try
  {
    strError = string.Empty;
    string lines = string.Empty;
    foreach (var item in newObcObject)
    {
      foreach (var prop in item.GetType().GetProperties())
      {
        //string str = prop.Name + " = " + prop.GetValue(item, null).ToString();
        lines += prop.GetValue(item, null).ToString() + "; ";
      }
    }
    return true;
  }
  catch (Exception exc)
  {
    strError = exc.ToString();
    return false;
  }
}

这是有效的。。

现在的问题是如何将特定的可观察集合转换为对象可观察集合。

这是我的解决方案,但我对其他任何解决方案都持开放态度。乙醇

如何使例程处理泛型类实例的可观察集合

您可以使用Cast扩展方法强制转换IEnumerable
由于ObservableCollection<>实现了IEnumerable,这也适用于它。

var c = new ObservableCollection<int>();
ObservableCollection<object> oc = c.Cast<int>();

由于您对newObcObject所做的只是枚举和反射,因此不需要它是ObservableCollection<T>。只需使其成为IEnumerable(您可能不需要它的通用对应物):

public static bool WriteLog_Reflection(string fileName, long maxLogSizeMB,
    IEnumerable newObcObject, out string strError)
{
    // ...
}

IEnumerable<T>的通用方法将允许简化代码:

public static bool WriteLog_Reflection<T>(string fileName, long maxLogSizeMB,
    IEnumerable<T> newObcObject, out string strError)
{
    // ...
    // This:
    // 
    // string lines = string.Empty;
    // foreach (var item in newObcObject)
    // {
    //     foreach (var prop in item.GetType().GetProperties())
    //     {
    //         lines += prop.GetValue(item, null).ToString() + "; ";
    //     }
    // }
    //
    // could be replaced to this:
    var lines = string.Join("; ", newObcObject
        .SelectMany(item => item.GetType().GetProperties(),
            (item, property) => property.GetValue(item, null)));
    // ...
}

您不需要通过ObservableCollection,因为您使用反射IEnumerable就足够了。几乎所有集合都实现IEnumerable(非通用集合!):

public static bool WriteLog_Reflection(string fileName, long maxLogSizeMB, IEnumerable newObcObject, out string strError)
{
    try
    {
        strError = string.Empty;
        string lines = string.Empty;
        foreach (var item in newObcObject)
        {
            foreach (var prop in item.GetType().GetProperties())
            {
                //string str = prop.Name + " = " + prop.GetValue(item, null).ToString();
                lines += prop.GetValue(item, null).ToString() + "; ";
            }
        }
        return true;
    }
    catch (Exception exc)
    {
        strError = exc.ToString();
        return false;
    }
}