在T4中使用来自托管项目的一些类?

时间:2011-09-03 10:03:10

标签: c# t4

我在项目中有Linq to sql模型,其中.tt也添加了。我希望在我的T4模板中使用该模型。如何对其进行引用的问题。如果它是一个网站和控制台应用程序。

2 个答案:

答案 0 :(得分:2)

让我们看看我是否理解正确。

  1. 您有一个使用Linq2Sql模型的项目
  2. 您想要将.TT文件添加到使用上述模型生成内容的项目
  3. 如果这是正确的,我会做的是加载.dbml文件(它是xml)并从中生成工件。

    这样的事情(VS2010模板可以从DataClasses1.dbml生成一些类):

    <#@ template    language="C#" hostspecific="true"   #>
    <#@ assembly    name="System.Core"                  #>
    <#@ assembly    name="System.Xml"                   #>
    <#@ assembly    name="System.Xml.Linq"              #>
    <#@ import      nameSpace="System.Linq"             #>
    <#@ import      nameSpace="System.Xml.Linq"         #>
    
    namespace MyProgram
    {
        using System.Data.Linq.Mapping;
    
    <#
        const string ns             = "{http://schemas.microsoft.com/linqtosql/dbml/2007}";
        const string DatabaseName   = ns + "Database";
        const string TableName      = ns + "Table";
        const string TypeName       = ns + "Type";
        const string ColumnName     = ns + "Column";
    
        var xdoc = XDocument.Load (Host.ResolvePath ("DataClasses1.dbml"));
        var tables = xdoc.Elements (DatabaseName).Elements (TableName);
    
        foreach (var table in tables)
        {
            var types = table.Elements (TypeName);
    
            foreach (var @type in types)
            {
                var columns = @type.Elements (ColumnName);
    #>
        [Table (Name = "<#=GetAttribute (@type, "Name")#>")]
        partial class <#=GetAttribute (@type, "Name")#>
        {
    <#
                foreach (var column in columns)
                {
    #>
            [Column (DbType = "<#=GetAttribute (column, "DbType")#>")]
            public <#=GetAttribute (column, "Type")#> <#=GetAttribute (column, "Name")#> { get; set; } 
    <#
                }
    #>
        }
    <#
            }
        }
    #>
    
    }
    
    <#+
        static string GetAttribute (XElement element, string name, string defaultValue = null)
        {
            if (defaultValue == null)
            {
                defaultValue = "<" + name + "_attribute_not_found>";
            }
            if (element == null)
            {
                return defaultValue;
            }
    
            var attribute = element.Attribute (name ?? "");
            if (attribute != null)
            {
                return attribute.Value ?? defaultValue;
            }
            else
            {
                return defaultValue;
            }
        }
    #>
    

答案 1 :(得分:0)