Получить System.Type из другой сборки в коде генератора текстового шаблона T4 - PullRequest
1 голос
/ 17 октября 2019

Я пишу текстовый шаблон T4, который читает CSV, содержащий имена классов с их полным пространством имен (MyNamespace.ClassExample), которые находятся в сборке, отличной от той, где находится T4.

Мне нужно разрешитькорреспондент System.Type в коде генератора T4.

Я уже пытался разрешить тип из System, и он работает так, как ожидалось, но когда я пытаюсь разрешить тип из моей сборки, он возвращаетзначение NULL. Даже используя полное имя сборки.

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="$(TargetDir)ClassLibrary1.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="ClassLibrary1" #>
<#
    Type type = Type.GetType("System.String");
    Type type2 = Type.GetType("ClassLibrary1.Class1");
    Type type3 = Type.GetType("ClassLibrary1.Class1, ClassLibrary1");
#>
This is a <#=type#>
This is a <#=type2#>
This is a <#=type3#>

Создает следующий вывод:

This is a System.String
This is a null
This is a null

Как вы можете видеть, я пытался загрузить dll сборки, включая ClassLibrary1Пространство имен на всякий случай (даже если оно не нужно).

Также пытался использовать EnvDTE, этот ответ на похожий вопрос выглядел многообещающе https://stackoverflow.com/a/38225980/2347708, но не может решить ITypeResolutionService

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="EnvDte" #>
<#@ assembly name="$(TargetDir)ClassLibrary1.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="ClassLibrary1" #>
<#
    Type GetTypeByName(IServiceProvider provider, string typeName)
    {
        var svc = (ITypeResolutionService)provider.GetService(typeof(ITypeResolutionService));
        // svc is null.
        return svc.GetType(typeName);
    }

    Type type = Type.GetType("System.String");
    Type type2 = GetTypeByName((IServiceProvider)this.Host, "ClassLibrary1.Class1, ClassLibrary1");
#>
This is a <#=type#>
This is a <#=type2#>
...