0

我正在执行以下操作:

  1. 在 XML 中定义工作流。
  2. 使用 LINQ 将工作流转换为对象。
  3. 在运行时,基于#2 创建一个基于 T4 的 C# 文件。
  4. 编译和实例化#3。

注意:所有这些都必须发生在客户端计算机上,因此不能依赖于 Visual Studio。

我已经弄清楚了#1 和#2,但只是#3 的一部分。我不知道如何将 XML => 对象步骤的结果传递给 tt 文件。

我的 tt 文件:

<#@ template language="C#" debug="true" hostSpecific="false" #>
<#@ output extension=".cs" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #> 
<#
#>
using System;

namespace RWT.Direct.Core.Public.Servers
{
    public partial class ServerClass
    {
        public void CanYouSeeMe()
        {
            Console.WriteLine("this should be from a property");
        }
    }
}

部分类(普通.cs):

namespace RWT.Direct.Core.Public.Servers
{
    public partial class ServerClass : ServerTemplate
    {
        public string MyParameter;
    }
}

调用代码:

ServerClass sc = new ServerClass();
sc.MyParameter = "abc"; // set property
String pageContent = sc.TransformText();
Console.WriteLine(pageContent); // compile step goes here

在实现中,属性将是 List 类型。

我该如何正确地做到这一点?

4

2 回答 2

1

除了扩展生成的模板类之外,还有另一种选择:

查看<#@ parameter #>指令 ( msdn )。使用此指令 t4 会自动为您生成一个可在模板代码中访问的属性:

<#@ template #>
<#@ parameter name="parameter" type="System.String" #>

// value of the parameter <#= this.parameter #>

您可以在创建模板实例时通过模板会话设置此属性:

var instance = new Template(); // replace Template with your template's class name
instance.Sesion = new Dictionary<string, object>();
instance.Session.Add("parameter", "this should be from a property");
instance.Initialize();

var result = instance.TransformText();

// compile your result here
于 2013-03-10T11:59:56.270 回答
0

我部分地从这里想通了。

于 2013-03-09T23:30:59.363 回答