如何在c#中创建这个奇怪的情况下的通用列表

Mar*_*tex 2 c# generics reflection types

在我的程序中,我有一个A扩展的类B,C以及更多的类.我有一个方法GetInstance()返回BC(或其中一个其他孩子)的实例,但我不知道哪一个,所以方法的返回类型是A.

在方法中CreateGenericList(),我有一个v类型的变量,A实际上是一个B,一个C或另一个子类型,我想创建一个正确类型的通用列表,即List<B>如果v是a BList<C>if v是a 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>.
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了下面的黑客攻击.我调用以下方法,希望类型推断器会猜测类型model,但它不起作用并返回一个List<A>.我相信因为c#是静态类型的,所以它T被解析为一个A而不是model运行时的真实类型.

static List<T> CreateGenericListFromModel<T>(T model) where T : A
{
    return new List<T> ();
}
Run Code Online (Sandbox Code Playgroud)

有没有人能够解决那些不使用反射的问题,或者没有反思就无法解决这个问题?

非常感谢你.

Fem*_*ref 5

如果没有反射,则无法解决此问题,因为必须在编译时知道泛型类型参数.如果你知道你是什么类型的(例如,通过.if(v[0] is B))你可以用v.Cast<B>()它从一个转换List<A>IEnumerable<B>,您可以通过调用再次变成一个列表ToList().