Генерация кода T4: типы доступа в текущем проекте

Можно ли с помощью генерации кода T4 получить доступ к типам, определенным в текущем проекте?

Например, если у меня есть интерфейс и я хочу делегировать его реализацию другому классу, т.е.

interface IDoSomething {
    public void do_something();
}

class DoSomethingImpl : IDoSomething {
    public void do_something() {
        // implementation...
    }
}

class SomeClass : IDoSomething {
    IDoSomething m_doSomething = new DoSomethingImpl();

    // forward calls to impl object
    public void do_something() {
        m_doSomething.do_something();
    }
}

Я хотел бы автоматизировать переадресацию звонков в SomeClass с помощью генерации кода; Это возможно?


person Paolo Tedesco    schedule 20.07.2009    source источник
comment
Спросите себя, как бы вы это сделали, если бы это не был сгенерированный код. Затем возьмите это решение и сгенерируйте его с помощью шаблона.   -  person John Saunders    schedule 20.07.2009
comment
@John Saunders: этот комментарий был довольно бесполезным, не так ли?   -  person Paolo Tedesco    schedule 27.07.2009
comment
Я так не думал. Возможно, вы понимаете, как это сделать, но не все понимают, как начать с чего-то, что работает, а затем параметризовать это в шаблоне.   -  person John Saunders    schedule 27.07.2009
comment
@John: Я не знаю, может быть, ты прав, и не все это понимают. В любом случае, здесь речь шла о том, как получить доступ к определениям типов в проекте, а не о том, как параметризовать существующий фрагмент...   -  person Paolo Tedesco    schedule 27.07.2009
comment
Кто-нибудь ответил на вопрос, используя только T4? Потому что мне не нужно искать другие решения, просто повторите через отражение для моих нужд.   -  person Richard Griffiths    schedule 31.08.2016
comment
Я ожидаю, что это невозможно, поскольку у вас есть своего рода ситуация с курицей и яйцом. Я добился чего-то подобного, переместив интерфейс в другую сборку, тогда вы можете просто использовать typeof(IDoSomething). Возможно, в вашей ситуации это невозможно. ХТН   -  person RikRak    schedule 17.04.2018


Ответы (1)


Хотя это не решает проблемы с блокировкой (хотя я слышал, что VS2010 решает), вы можете попробовать скопировать dll во временное место и просто использовать эту скопированную сборку.

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.IO" #>
<#    
var newFileName = System.IO.Path.GetTempFileName();
System.IO.File.Copy(@"C:\Development\CustomAssembly.dll",newFileName,true);

var assembly = Assembly.LoadFrom(newFileName);
var type = assembly.GetType("CustomAssembly.DummyClass");   
#>
<#=newFileName#>
<#=type#>
person Rob    schedule 16.05.2011