以 yield return 返回泛型参数 T

Returning generic parameter T with yield return

我想从加载的 dll 文件生成类型列表(继承自 class T)。但是当我使用下面的代码时,应用程序变成 frozen/stuck:

static IEnumerable<T> GetAllTypes<T>(string dllName)
{
    Assembly plugin = Assembly.LoadFrom(dllName);
    if (plugin != null)
    {
        Type[] types = plugin.GetTypes();
        foreach (var type in types)
        {
            if (type.IsClass && type.IsSubclassOf(typeof(T)))
            {
                Console.WriteLine(type.Name);
                yield return (T)(Object)type;
            }
        }
    }
    else
        throw new InvalidDataException();
}

但是,如果我不使用 yield return,一切都会按预期进行,不会发生冻结。谁能解释这种行为?

static void GetAllTypes<T>(string dllName)
{
    Assembly plugin = Assembly.LoadFrom(dllName);
    if (plugin != null)
    {
        Type[] types = plugin.GetTypes();
        foreach (var type in types)
        {
            if (type.IsClass && type.IsSubclassOf(typeof(T)))
            {
                Console.WriteLine(type.Name);
                //yield return (T)(Object)type;
            }
        }
    }
    else
        throw new InvalidDataException();
}

请注意 typeSystem.Type 实例。你应该(屈服)return 它,并使 IEnumerable<System.Type> 成为 return 类型。

您的类型转换代码试图将该对象转换为 T 实例,这是无效且不可能的,它永远无法工作。 T 类型的对象与 T 类型本身不同,但这正是您的代码试图强制执行的。

不确定 'hang' 是否是结果,但转换代码是错误的。

您的应用程序可能没有卡住,问题是迭代器惰性。你已经提出了一个问题,但你还没有真正问过它。

var types = GetTypes("Foo");

这只会创建一个查询,但不会实际执行它。这将:

foreach (var t in types) { ... }

也就是说,您的代码永远不会像其他答案中解释的那样工作。 typeof(T)T 是完全不同的东西。