2010-06-09 64 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