【问题标题】:T4 Template InterceptionT4 模板拦截
【发布时间】:2011-01-16 06:49:57
【问题描述】:

我想知道是否有人知道任何基于 T4 模板的方法拦截系统?

我们开始编写移动应用程序(目前使用 MonoTouch for IOS)。我们有一套非常好的 DI/IoC 核心功能,我想在新平台的开发中利用它。由于不支持运行时代码生成 Reflection.Emit,我希望使用 T4 模板来实现动态拦截功能(+ TinyIoC 作为解析的容器)。

我们目前正在使用 Castle Windsor(并打算继续为我们的 SL 和完整的 .NET 开发使用),但是所有 Windsor 特定的关系都被完全封装,所以如果有合适的 T4 解决方案,应该不难实现一个使用基于 T4 的实现而不是 Windsor 的适配器。

【问题讨论】:

    标签: .net dependency-injection inversion-of-control xamarin.ios t4


    【解决方案1】:

    如果我理解正确,您想使用 T4 动态生成代码(在运行时)。我不知道有什么系统可以做到这一点,但我认为编写这样的东西并不难。

    您需要做的是指示 C#(或任何其他 .NET 编译器)编译一些代码并生成程序集。完成后,您需要将此程序集加载到您的 AppDomain 中。之后,您可以使用该动态加载程序集中的类型。

    T4 模板引擎(如果我没记错的话)是 Visual Studio 的一部分,因此最难的部分是指示模板引擎生成代码,而您的应用程序可能不需要依赖于 Visual Studio,甚至不需要启动它(那会很糟糕)。

    如果您不需要 T4 的全部功能(很可能),您也可以自己生成一些 .NET 代码,将其保存到文件中并指示 C# 编译器为您生成程序集。

    祝你好运。

    【讨论】:

    • 实际上有一个 Mono 项目可以在运行时动态使用它:)....但这实际上并不是我在这里想要做的。即使我可以在运行时完成,那也不好,因为平台(MonoTouch/iOS)不允许我在运行时编译它(没有动态代码发射)。我试图在构建时从 T4 模板自动生成和编译代码,以便产生与运行时生成的类相同的效果。我喜欢你的最后一个想法...也许有一个控制台应用程序可以遍历已编译的程序集并使用 CSharpCodeProvider 将代理类吐出到已编译的文件中...?