Определение того, реализует ли класс общий список в шаблоне T4 - PullRequest
2 голосов
/ 09 июня 2010

Я пишу шаблон T4, который загружает некоторые классы из сборки, выполняет некоторый анализ классов и затем генерирует некоторый код. Один конкретный анализ, который мне нужно сделать, - определить, реализует ли класс общий список. Я могу сделать это довольно просто в C #, например

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, поэтому у вас нет доступа к .net отражению API. Я провел последние пару часов в Reflector, но до сих пор не могу понять. У кого-нибудь есть подсказки о том, как это сделать?

Ответы [ 2 ]

0 голосов
/ 09 июня 2010

Понял, это не очень красиво, но все типы загружаются с использованием AssemblyNode.Load имеют тип TypeNode, чтобы определить, реализует ли тип List, вы должны сделать это:

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

надеюсь, это кому-нибудь поможет!

0 голосов
/ 09 июня 2010

Я скачал Introspector с http://www.binarycoder.net/fxcop/ (как я уже упоминал в своем комментарии), и похоже, что вам нужно проверить BaseType или шаблон BaseClass.

...