在我的程序中,我有一个A
类,该类由B
,C
和许多其他类扩展。我有一个方法GetInstance()
返回一个B
或C
(或另一个孩子之一)的实例,但是我不知道是哪个实例,所以该方法的返回类型是A
。
在方法CreateGenericList()
中,我有一个v
类型的变量A
,实际上它是B
,C
或另一个子类型,我想创建一个适当类型的通用列表。 ,即List<B>
如果v
是B
或List<C>
如果v
是C
,...
目前,我通过使用反射来完成此操作,但效果非常慢。我想知道是否还有另一种方法,它不使用反射。
这是我的问题的代码示例:
class A { }
class B : A { }
class C : A { }
// More childs of A.
class Program
{
static A GetInstance()
{
// returns an instance of B or C
}
static void CreateGenericList()
{
A v = Program.GetInstance();
IList genericList = // Here I want an instance of List<B> or List<C> or ... depending of the real type of v, not a List<A>.
}
}
我尝试了以下技巧。我调用以下方法,希望类型推断器猜出
model
的类型,但它不起作用并返回List<A>
。我相信,因为c#是静态类型的,所以在运行时T
被解析为A
而不是model
的实际类型。static List<T> CreateGenericListFromModel<T>(T model) where T : A
{
return new List<T> ();
}
是否有人可以解决不使用反射的问题,或者没有反射就不可能解决该问题?
非常感谢你。
最佳答案
没有反射就无法解决此问题,因为必须在编译时知道泛型类型参数。如果知道类型(例如通过if(v[0] is B)
),则可以使用v.Cast<B>()
将其从List<A>
转换为IEnumerable<B>
,您可以通过调用ToList()
将其转换为列表。