Ответ 1
Я бы рекомендовал использовать CodeModel. Вот пример . Держитесь подальше от Reflection, T4 заблокирует скомпилированные двоичные файлы. Если CodeModel не работает для того, что вы пытаетесь сделать, попробуйте Introspection (пример).
Используя генерацию кода 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
с генерацией кода; возможно ли это?
Я бы рекомендовал использовать CodeModel. Вот пример . Держитесь подальше от Reflection, T4 заблокирует скомпилированные двоичные файлы. Если CodeModel не работает для того, что вы пытаетесь сделать, попробуйте Introspection (пример).
Хотя это не решает проблемы с блокировкой (хотя и слышал, что 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#>