2010-06-09 73 views
2

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

public class Foo : List<string> { } 

var t = typeof(Foo); 

if (t.BaseType != null && t.BaseType.IsGenericType && t.BaseType.GetGenericTypeDefinition() == typeof(List<>))) 
    Console.WriteLine("Win"); 

但是T4模板使用FXCop introspection引擎,因此您无权访问.net反射API。我已经在Reflector中度过了几个小时,但仍然无法弄清楚。有没有人有任何关于如何做到这一点的线索?

+0

我认为T4模板被编译为正常的.NET代码并执行正常。你是否说过“从程序集中加载一些类”不是按照正常的方式完成的?我认为做一个正常的.NET程序集加载会给你全面的反射支持,不是吗? – 2010-06-09 11:49:48

+0

你看过第一个相关问题指出的http://www.binarycoder.net/fxcop/吗? – 2010-06-09 12:00:06

+0

@Lasse不幸的是,t4模板无法使用Reflection API,因为它针对代码执行进行了优化,并导致代码生成问题(在本博客的概述中正确解释了http://www.olegsych.com/2007/12/how-to -use-t4-to-generate-decorator-classes /) – 2010-06-09 13:14:13

回答

0

想通了,这不是很漂亮,但所有类型的加载使用AssemblyNode.Load的类型TypeNode的,以确定该类型实现了清单,你必须这样做:

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

希望它可以帮助别人!

+0

而不是按名称匹配,你可以使用FrameworkTypes.GenericList。 – 2010-06-14 18:55:13

0

我从http://www.binarycoder.net/fxcop/下载了Introspector(正如我在我的评论中提到的),看起来您需要检查BaseType或BaseClass模板。

+0

Introspector不幸的是没有给我更多的Reflector信息。 – 2010-06-09 14:28:56