T4代码生成:访问当前项目中的类型

17

使用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 中的呼叫转移;这是否可行?


问问自己,如果这不是生成的代码,你会怎么做。然后采用那个解决方案并让模板生成它。 - John Saunders
4
@John Saunders:这个评论相当无用,是吗? - Paolo Tedesco
我并不认为这很简单。也许你知道如何做,但并非每个人都理解从一个可行的东西开始,然后在模板中将其参数化的过程。 - John Saunders
@John:我不知道,也许你是对的,不是每个人都能理解。无论如何,这里的重点是如何访问项目中的类型定义,而不是如何参数化现有片段... - Paolo Tedesco
有人使用仅T4回答了这个问题吗?因为我不需要寻找其他解决方案,只需通过反射进行迭代以满足我的需求。 - Richard Griffiths
我认为这可能是不可能的,因为你有一种鸡生蛋的情况。我通过将接口移动到另一个程序集中实现了类似的功能,然后你可以使用typeof(IDoSomething)。在你的情况下可能不可行。希望对你有所帮助。 - RikRak
1个回答

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#>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接