在我的程序中,我有一个A类,该类由BC和许多其他类扩展。我有一个方法GetInstance()返回一个BC(或另一个孩子之一)的实例,但是我不知道是哪个实例,所以该方法的返回类型是A

在方法CreateGenericList()中,我有一个v类型的变量A,实际上它是BC或另一个子类型,我想创建一个适当类型的通用列表。 ,即List<B>如果vBList<C>如果vC,...

目前,我通过使用反射来完成此操作,但效果非常慢。我想知道是否还有另一种方法,它不使用反射。

这是我的问题的代码示例:

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()将其转换为列表。

07-28 03:16
查看更多