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

标签 c# generics reflection types

在我的程序中,我有一个类 A扩展为 B , C以及更多类(class)。我有一个方法GetInstance()它返回 B 的实例或C (或其他子级之一),但我不知道是哪一个,因此该方法的返回类型是 A .

在方法CreateGenericList()中,我有一个变量 v类型 A ,实际上是 B ,一个C或其他子类型,我想创建正确类型的通用列表,即 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() 再次将其转换为列表。 .

关于c# - 如何在 C# 中的这种奇怪情况下创建通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2965280/

相关文章:

c# - 列表创建和对象初始化器

c# - C# 中的异常处理 - 如何处理?

Scala - 当依赖类也使用相同的泛型类型时,使用 guice 注入(inject)泛型类型

c# - 如何在 C# XML 摘要中显示泛型类型

java - 如何在java中获取方法的字符串名称?

c# - System.Drawing.Image 流式传输 C#

c# - 游戏结束场景不起作用 (Unity C#)

java - 为什么几个 java.util.List 方法不使用类型参数?

c# - 使用参数安全调用多次调用泛型方法(运行时返回类型)的最佳方法

android - Kotlin 反射的 ProGuard 规则