【问题标题】:T4 code generation: access types in current projectT4 代码生成:当前项目中的访问类型
【发布时间】:2009-07-20 13:22:43
【问题描述】:

使用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:这条评论毫无用处,不是吗?
  • 我认为不是。也许知道如何做到这一点,但并不是每个人都了解从可行的东西开始,然后在模板中对其进行参数化的过程。
  • @John:我不知道,也许你是对的,并不是每个人都明白。无论如何,这里的重点是如何访问项目中的类型定义,而不是如何参数化现有的 sn-p...
  • 有人用 T4 回答过这个问题吗?因为我不需要寻找其他解决方案,只需根据我的需要通过反射进行迭代。

标签: c# .net t4


【解决方案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#>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多