我有几个类,都来自SuperClass。
创建类时,它们都被放入List(Of SuperClass)中。 当我浏览列表时,我想将SuperClass对象向下转换为其baseObject,并将其放入正确的列表中。 (我为SuperClass的每个子类型创建了一个列表)。
可以确定:
If TypeOf SuperClass Is SubClass Then
listOfSubClass.Add(DirectCast(SuperCLass, SubClass)
End If
但是当有几个课时,这是很多工作。
使用
SuperClass.GetType.FullName
我得到了subClass的类型。
我的问题是:是否可以使用它来动态转换SuperClass对象? 在psudoCode中:
For each SuperClass
Dim temp As SuperClass.GetType.FullName = _
DirectCast(SuperCLass, SuperClass.GetType.FullName
list.add(temp)
Next
编辑: 我希望我可以使用变量而不是为每个SubClass创建一个case并在一个循环中完成所有操作。
答案 0 :(得分:4)
您是否考虑过使用LINQ的OfType扩展方法?它包装一个枚举并过滤元素,以便只返回指定类型的元素。您可以像这样使用它:
list.AddRange(superList.OfType(Of SubClass)())
甚至:
list = superList.OfType(Of SubClass)().ToList()
很抱歉,如果我的语法已关闭,那么自从我使用VB.NET以来已经有一段时间了
编辑示例,如承诺:
namespace Demo.ListFilter
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
class Program
{
private class SuperClass
{
}
private class SubClassA :
SuperClass
{
}
private class SubClassB :
SuperClass
{
}
static void Main(string[] args)
{
var superList = new List<SuperClass>()
{
new SuperClass(),
new SuperClass(),
new SuperClass(),
new SuperClass(),
new SubClassA(),
new SubClassA(),
new SubClassA(),
new SubClassB(),
new SubClassB(),
new SubClassB(),
new SubClassB()
};
var listA = new List<SubClassA>();
var listB = new List<SubClassB>();
SplitList(superList, listA, listB);
Console.WriteLine("List A: {0}", listA.Count);
Console.WriteLine("List B: {0}", listB.Count);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
static void SplitList(IList superList, params IList[] subLists)
{
foreach(var subList in subLists)
{
var type = subList.GetType().GetGenericArguments()[0];
FilterList(superList, subList, type);
}
}
static void FilterList(IList superList, IList subList, Type type)
{
var ofTypeMethod = typeof(Enumerable).GetMethod("OfType");
var genericMethod = ofTypeMethod.MakeGenericMethod(type);
var enumerable = (IEnumerable)genericMethod.Invoke(null, new[] { superList });
foreach(var item in enumerable)
{
subList.Add(item);
}
}
}
}
另一个编辑:您还可以组合这样的方法:
static void SplitList(IList superList, params IList[] subLists)
{
var ofTypeMethod = typeof(Enumerable).GetMethod("OfType");
foreach(var subList in subLists)
{
var subListType = subList.GetType();
var type = subListType.GetGenericArguments()[0];
var genericOfTypeMethod = ofTypeMethod.MakeGenericMethod(type);
var enumerable = genericOfTypeMethod.Invoke(null, new[] { superList });
var addRangeMethod = subListType.GetMethod("AddRange");
addRangeMethod.Invoke(subList, new[] { enumerable });
}
}
不要忘记添加错误处理!