如何使例程处理泛型类实例的可观察集合
本文关键字:观察 集合 实例 泛型类 何使 例程 处理 | 更新日期: 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;
}
}