我已经开始涉足 T4 并且一开始相处得很好,但后来遇到了一个实际上非常明显并且可能无法解决的问题,但也许有一种方法我只是缺乏了解或了解的经验。
给定以下课程:
public class T4Test : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
}
[Input("InX")]
public InArgument<string> InX { get; set; }
[Output("OutX")]
public OutArgument<string> OutX { get; set; }
}
我想要这个作为输出:
public class ActivityWrapper
{
private readonly T4Test _activity;
private readonly ActivityContext _context;
public ActivityWrapper(T4Test activity, ActivityContext context)
{
this._activity = activity;
this._context = context;
}
public string InX
{
get { return this._activity.InX.Get(this._context); }
}
public string OutX
{
get { return this._activity.OutX.Get(this._context); }
set { this._activity.OutX.Set(this._context, value); }
}
}
我已经弄清楚了我需要的反射的东西,我知道 T4 代码应该是什么样子,但是有一个问题:我需要它与T4Test
类在同一个项目中。但是,要加载程序集并对其进行反映,需要对其进行编译——但如果我打算修改同一个程序集的代码,那当然有点困难。(而且我猜 NCrunch 并没有简化事情。)
现在这是我希望仍然可以解决这个问题的事情:
- 该项目将在没有生成的类的情况下编译。这是因为该类将实现由 IoC 容器自动注册/解析的接口。无论如何它也是不可测试的,因为
ActivityContext
不能被嘲笑。 - 出于这个原因,它不必一直存在或正确。在实际交付 DLL 之前,我只需要能够说“立即生成”。
- 出于同样的原因,我也不关心 T4 模板是否真的存在于项目中——只要生成的文件最终出现在项目中(尽管不需要另一个项目作为模板并构建 PostBuild 事件来复制
.cs
文件) . - 准确地说,它甚至不需要是T4。如果有任何其他可行的方法可以做到这一点,我也很乐意使用它。
有什么办法可以做到这一点?(这是否足够清楚?)