English 中文(简体)
自定义 T4 预处理模板
原标题:Customizing a T4 preprocessed template
  • 时间:2012-05-24 14:31:55
  •  标签:
  • c#
  • t4

What I m trying to do

我正试图使用 T4 创建邮件消息模板 。

我正在使用一个 预处理模板 , 如果我太过正确, 如果我想在运行时生成该信息而不引入对 微软。 visualStudio.TextTemplating 组装的依赖, 我就必须这样做。

由于我想将一些数据传送到我的模板,我增加了一些参数:

<#@ template language="C#" #>
<#@ parameter name="Param1" type="System.String" #>
<#@ parameter name="Param2" type="System.    
Lorem <#= Param1 #> dolor <#= Param2 #>

这样我就能产生这样的传递信息:

static void Main(string[] args) {
    var template = new LoremIpsum();
    template.Session = new Dictionary<string, object>() { 
        {"Param1", "ipsum"},
        {"Param2", "sit amet"},
    };
    template.Initialize();
    string text = template.TransformText();
}

What is the problem

因为我需要上几个这样的班级, 我希望他们都有一个共同的邮件发送方法, 类似这样的东西:

public void SendMail(string to, IDictionary<string, object> parameters)

或,更佳的:

public void SendMail(string to, string Param1, string Param2)

由于生成的类别是局部的,因此有可能增加方法,增加另一个部分类别声明,但这意味着我必须对所有生成的类别重复(或多或少)相同的代码。

What I tried so far

我试图创建一个基础类, 但如果我尝试这样做:

<#@ template language="C#" inherits="MailTemplateBase" #>

然后是生成的代码解码符, 因为生成的类依赖于 < code> LoremIpsumBase 基类, 该基类定义了一些辅助方法( 我真的看不出来每个生成的类从几乎相同但不同的基类继承来有什么意义 ) 。

Questions

  1. How can I have a base class for my templates?
  2. How can I generate a method that accepts the same parameters as those declared in the template?
最佳回答

我认为您需要创建一个空模板, 复制创建的类, 并将其作为基本类 。 然后您可以随您需要的属性扩展它 。 (您不需要在复制代码后保留空模板) 。

值得一提的是,我认为你试图从VS 2010 RTM中的框中工作,但VS 2010 SP1 改变了行为,以便您自己可以使用子类模板。看看这个 < a href="http://connect.microsoft.com/VisualStudio/feedback/details/64360/t4-dection-second-due-due-drogen-broken-med-med-med-med-pre-produced-t-plates- with-inherits- base base class-legal-dent-directives-and- desclapon-blocks" rel="nofolpolt" 连接问题 以获得更多信息。

编辑:

至于在基底上安装电子邮件方法,我可能不会这样做。你可能想曝光某种具有你需要的各种方法的微博服务,例如:

public class TemplatingService : ITemplatingService
{
    public string GenerateReminderMessage(string to, string name)
    {
        // Construct the template, passing in the parameters into the session as required
        ...
        // Return the results of the template transformation
    }
}

这样你就可以从实际的T4执行中 重新抽取出来。 所以如果有什么东西偏离了线条, 你只需要把它固定在一个等级。

并揭发邮件服务, 使用微博服务生成邮件内容 :

public class MailService : IMailService
{
    public void SendReminderEmail(string to, string name)
    {
        var message = this.TemplatingService.GenerateReminderMessage(to, name);
        this.MailerService.SendEmail(to, message);
    }
}

请注意,邮件服务 将只是一个简单的包装 围绕.NET 邮件代码, 但它允许你单位测试邮件服务 单独。

可能有更多的方法 你可以把它抽象出来, 但这将是一个开始。

希望这有帮助。

问题回答

这听起来像是你假设的, 建造者注射是将数据注入阶级的唯一方法。 但我猜,在这种假设中, 美食/财产注射是更好的选择。

我手头没有编译器,无法肯定核实,但似乎有用。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签