C# 确定类是否在T4模板中实现泛型列表

C# 确定类是否在T4模板中实现泛型列表,c#,templates,t4,fxcop,C#,Templates,T4,Fxcop,我正在编写一个T4模板,它从程序集中加载一些类,对这些类进行一些分析,然后生成一些代码。我需要做的一项特殊分析是确定该类是否实现了泛型列表。我可以用C#简单地做到这一点,例如 公共类Foo:List{} var t=类型(Foo); if(t.BaseType!=null&&t.BaseType.IsGenericType&&t.BaseType.GetGenericTypeDefinition()==typeof(列表))) Console.WriteLine(“Win”); 但是T4模板使

我正在编写一个T4模板,它从程序集中加载一些类,对这些类进行一些分析,然后生成一些代码。我需要做的一项特殊分析是确定该类是否实现了泛型列表。我可以用C#简单地做到这一点,例如

公共类Foo:List{}
var t=类型(Foo);
if(t.BaseType!=null&&t.BaseType.IsGenericType&&t.BaseType.GetGenericTypeDefinition()==typeof(列表)))
Console.WriteLine(“Win”);

但是T4模板使用FXCop内省引擎,因此您无法访问.net反射API。我已经在Reflector里呆了几个小时,但还是想不出来。有人知道怎么做吗?

我从(我在评论中提到的)下载了Interspector,看起来您需要检查基类或基类模板。

弄明白了,它不是很漂亮,但所有类型都是使用AssemblyNode加载的。加载类型是TypeNode,要确定类型是否实现列表,必须执行以下操作:

node.BaseType.IsGeneric && node.BaseType.Template == FrameworkAssemblies.Mscorlib.Types.SingleOrDefault(t => t.FullName == "System.Collections.Generic.List`1")

希望它能帮助别人

我认为T4模板被编译成普通的.NET代码,并像普通代码一样执行。你是说“从程序集加载一些类”不是按正常方式完成的吗?我认为,正常的.NET程序集加载将为您提供全面的反射支持,不是吗?您是否已查看了第一个相关问题所指的内容?@Lasse不幸的是,t4模板无法使用反射API,因为它针对代码执行进行了优化,并导致代码生成问题(在本博客的概述中正确解释)这难道不意味着,除非您采取必要的步骤将程序集加载到它们自己的appdomain中以便能够卸载它们,否则您不应该使用反射吗?这篇文章没有读过对我来说,由于您不能在T4中使用反射,很遗憾,Interspector没有给我有关反射的更多信息。您可以使用FrameworkTypes.GenericList,而不是按名称进行匹配。
node.BaseType.IsGeneric && node.BaseType.Template == FrameworkAssemblies.Mscorlib.Types.SingleOrDefault(t => t.FullName == "System.Collections.Generic.List`1")