以 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();
}
请注意 type
是 System.Type
的 实例。你应该(屈服)return 它,并使 IEnumerable<System.Type>
成为 return 类型。
您的类型转换代码试图将该对象转换为 T
的 实例,这是无效且不可能的,它永远无法工作。 T 类型的对象与 T 类型本身不同,但这正是您的代码试图强制执行的。
不确定 'hang' 是否是结果,但转换代码是错误的。
您的应用程序可能没有卡住,问题是迭代器惰性。你已经提出了一个问题,但你还没有真正问过它。
var types = GetTypes("Foo");
这只会创建一个查询,但不会实际执行它。这将:
foreach (var t in types) { ... }
也就是说,您的代码永远不会像其他答案中解释的那样工作。 typeof(T)
和 T
是完全不同的东西。
我想从加载的 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();
}
请注意 type
是 System.Type
的 实例。你应该(屈服)return 它,并使 IEnumerable<System.Type>
成为 return 类型。
您的类型转换代码试图将该对象转换为 T
的 实例,这是无效且不可能的,它永远无法工作。 T 类型的对象与 T 类型本身不同,但这正是您的代码试图强制执行的。
不确定 'hang' 是否是结果,但转换代码是错误的。
您的应用程序可能没有卡住,问题是迭代器惰性。你已经提出了一个问题,但你还没有真正问过它。
var types = GetTypes("Foo");
这只会创建一个查询,但不会实际执行它。这将:
foreach (var t in types) { ... }
也就是说,您的代码永远不会像其他答案中解释的那样工作。 typeof(T)
和 T
是完全不同的东西。