如何将Type.InvokeMember获取的Object转换为ObservableCollection等目标类型?
嘿,这个问题我熟!你通过Type.InvokeMember()拿到的是一个被object包装的ObservableCollection<SomeType>,其实有几种靠谱的处理方式,我给你一步步讲清楚:
1. 转换为原始的
ObservableCollection<SomeType>类型 分两种场景处理:
- 如果明确知道
SomeType的具体类型:直接强转就完事了,简单高效
// 假设你的SomeType是MyCustomClass var originalCollection = (ObservableCollection<MyCustomClass>)yourObject;
- 如果不知道
SomeType的具体类型:可以通过反射识别集合类型和元素类型,再做后续操作
Type collectionType = yourObject.GetType(); // 先确认确实是ObservableCollection<>的实例 if (collectionType.IsGenericType && collectionType.GetGenericTypeDefinition() == typeof(ObservableCollection<>)) { // 获取集合的元素类型 Type itemType = collectionType.GetGenericArguments()[0]; // 举个例子:用反射遍历集合元素 IEnumerator enumerator = ((IEnumerable)yourObject).GetEnumerator(); while (enumerator.MoveNext()) { object item = enumerator.Current; // 这里可以根据itemType对元素做反射操作,比如获取属性值等 } }
2. 转换为
List<OriginalType> 同样分两种情况:
- 已知元素类型:直接强转后调用
ToList()
var targetList = ((ObservableCollection<MyCustomClass>)yourObject).ToList();
- 未知元素类型:可以用动态类型简化代码,或者用反射调用
Enumerable.ToList()方法
// 方式1:用dynamic简化 dynamic dynamicCollection = yourObject; var targetList = dynamicCollection.ToList(); // 方式2:用反射实现强类型List(适合需要获取具体List类型的场景) Type itemType = yourObject.GetType().GetGenericArguments()[0]; Type listType = typeof(List<>).MakeGenericType(itemType); MethodInfo toListMethod = typeof(Enumerable).GetMethod("ToList").MakeGenericMethod(itemType); object targetList = toListMethod.Invoke(null, new[] { yourObject });
3. 转换为
DataTable 可以写一个通用方法,通过反射遍历集合元素的属性,自动生成DataTable的列和行:
public static DataTable ConvertObservableCollectionToDataTable(object collection) { DataTable dataTable = new DataTable(); if (collection == null) return dataTable; Type collectionType = collection.GetType(); // 先校验输入类型 if (!collectionType.IsGenericType || collectionType.GetGenericTypeDefinition() != typeof(ObservableCollection<>)) throw new ArgumentException("输入对象必须是ObservableCollection类型"); Type itemType = collectionType.GetGenericArguments()[0]; // 获取元素的所有公共属性,作为DataTable的列 PropertyInfo[] itemProperties = itemType.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo prop in itemProperties) { dataTable.Columns.Add(prop.Name, prop.PropertyType); } // 遍历集合,把每个元素的属性值填入DataTable行 IEnumerable enumerableCollection = (IEnumerable)collection; foreach (object item in enumerableCollection) { DataRow row = dataTable.NewRow(); foreach (PropertyInfo prop in itemProperties) { row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; } dataTable.Rows.Add(row); } return dataTable; }
调用时直接传入你的对象即可:
DataTable resultTable = ConvertObservableCollectionToDataTable(yourObject);
内容的提问来源于stack exchange,提问作者Thinker
相关产品推荐
相关产品推荐

