Использовать в Т4 какой-то класс из хостинг-проекта? - PullRequest
2 голосов
/ 03 сентября 2011

У меня есть модель Linq to sql внутри проекта, в которую также добавлен .tt. Именно эту модель я хочу использовать в своем шаблоне T4. Вопрос, как поставить на него ссылку. Если это веб-сайт и консольное приложение тоже.

Ответы [ 2 ]

2 голосов
/ 03 сентября 2011

Посмотрим, правильно ли я вас понимаю.

  1. У вас есть проект с моделью Linq2Sql
  2. Вы хотите добавить файл .TT к тому проекту, который использует вышеупомянутую модель для генерации чего-либо

Если это правильно, я бы загрузил файл .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;
        }
    }
#>
0 голосов
/ 03 сентября 2011

Вы должны найти это полезным:

http://www.olegsych.com/2008/02/t4-assembly-directive/

...