标签: t4

如何从T4中获取项目目录?

我一直在搞乱Mono中的T4支持,并注意到一件非常麻烦的事情.运行T4模板时的当前目录是主目录.我需要能够从当前项目的目录中读取一些文件,但我不知道如何.

<#@ template language="C#v3.5" #>
<#@ output extension="txt" #>

<#=System.IO.Directory.GetCurrentDirectory() #>
Run Code Online (Sandbox Code Playgroud)

产量

/home/earlz
Run Code Online (Sandbox Code Playgroud)

在哪里,我希望它产生类似的东西

/home/earlz/MyProject
Run Code Online (Sandbox Code Playgroud)

我该如何克服这个问题?

此外,我尝试了hostspecific和Host.ResolvePath,但我得到了一个N​​otImplementedException

.net mono t4

4
推荐指数
1
解决办法
2616
查看次数

使用T4模板生成代码时引用第三方DLL

我正在尝试编写一个需要登录FB以获取文档的T4模板.要做到这一点,我需要引用第三方DLL.可以这样做,如果是这样,怎么办?

c# t4 code-generation

4
推荐指数
1
解决办法
824
查看次数

如何在声明中有条件地设置基类

我有一个修改过的T4模板,它可以从我的edmx构建类,并且除了派生类之外它还能顺利运行.

Product : BaseItem // works fine as do all top level classes

TranslatedProduct : Product : BaseItem  // dang
Run Code Online (Sandbox Code Playgroud)

我对如何以及在何处有条件地将T4模板设置为忽略感到困惑:在派生类的情况下BaseItem - 即

TranslatedProduct : Product
Run Code Online (Sandbox Code Playgroud)

例如:

<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#> : BaseItem
Run Code Online (Sandbox Code Playgroud)

在我的脑海里,我想象它 -

if(code.Escape(entity.BaseType).Equals(string.empty)
{
   <#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#> : BaseItem
}
else
{
<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial      class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>
}
Run Code Online (Sandbox Code Playgroud)

但是我收到了语法错误,所以我想看看是否还有其他人试过这个,如果我走的是正确的道路

.net c# t4 entity-framework

4
推荐指数
1
解决办法
2343
查看次数

使用 T4 生成 Poco 类,忽略 StoreGeneratedPattern 属性

我在 vs 2010 中使用 Poco & DbContext T4 模板为我的数据访问生成 pocos,我已经修改了它以匹配我的数据访问层所需的一些语法。

我有一个问题,edmx 文件中的标识列 (StoreGeneratedPattern = Identity) 不会影响 T4 生成过程,这是我的代码:

var identity = edmProperty.TypeUsage.Facets.Where(f => f.Name == "StoreGeneratedPattern").FirstOrDefault();
        if (identity != null && ((System.Data.Metadata.Edm.StoreGeneratedPattern)identity.Value) == System.Data.Metadata.Edm.StoreGeneratedPattern.Identity)
                    isIdentity = true;
Run Code Online (Sandbox Code Playgroud)

这总是如此false,有什么原因吗?

t4 entity-framework poco edmx entity-framework-4.1

4
推荐指数
1
解决办法
1069
查看次数

通过反射在同一个程序集上生成代码

我已经开始涉足T4并且第一次相处得很好,但后来遇到了一个实际上非常明显并且可能无法解决的问题,但也许有一种方法我只是缺乏了解或看到的经验.

鉴于以下课程:

public class T4Test : CodeActivity
{
    protected override void Execute(CodeActivityContext context)
    {
    }

    [Input("InX")]
    public InArgument<string> InX { get; set; }

    [Output("OutX")]
    public OutArgument<string> OutX { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望这作为输出:

public class ActivityWrapper
{
    private readonly T4Test _activity;
    private readonly ActivityContext _context;

    public ActivityWrapper(T4Test activity, ActivityContext context)
    {
        this._activity = activity;
        this._context = context;
    }

    public string InX
    {
        get { return this._activity.InX.Get(this._context); }
    }

    public string OutX
    {
        get { return this._activity.OutX.Get(this._context); }
        set { this._activity.OutX.Set(this._context, …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection t4

4
推荐指数
1
解决办法
3088
查看次数

使用EnvDte迭代类成员时跳过私有属性

我编写了这个帮助器方法来从类中获取属性,但它也获取了私有属性.我怎样才能获得公共财产?

public IEnumerable<string> GetProperties(CodeClass @class)
{
    return @class.Members.Cast<CodeElement>()
    .Where(ce => ce.Kind == vsCMElement.vsCMElementProperty)
    .Select(ce => ce.Name)
    .ToList();
}
Run Code Online (Sandbox Code Playgroud)

更新:您可以在这里查看有关此技术的更深入的博客http://andersmalmgren.com/2014/02/05/typed-javascript-contracts-using-t4-templates/

c# t4 envdte

4
推荐指数
1
解决办法
916
查看次数

使用T4模板基于POCO生成多个类

我正在寻找一种方法来提高生产力,当我向我的数据库添加一个表.通常,当我添加新表时,我必须执行以下步骤.

  1. 将表添加到数据库(简单)
  2. 创建相应的EF Code First类.(我不使用db迁移)
  3. 创建一个与#2中创建的EF类匹配的POCO模型.
  4. 创建存储库类
  5. 为CQRS模式创建命令和处理程序
  6. 为新创建的类创建AutoMapper映射

我最近创建了一个新网站,其中要求首先使用EF数据库,我看到它是如何使用tt文件生成类的.这让我想到我可以以某种方式使用这些模板(新模板)来生成基本CRUD操作的所有标准支持项.麻烦的是我没有创建这些模板的经验,也不知道从哪里开始.

要生成的示例代码:

知识库

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public interface IUsersRepository : IRepository<Users>
{
}

public class UsersRepository : RepositoryBase<Users>, IUsersRepository
{
    public UsersRepository(IDatabaseFactory databaseFactory)
        : base(databaseFactory)
    {
    }

}
Run Code Online (Sandbox Code Playgroud)

基于EDMX(或Code First)生成的实体的基本模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class User 
{
    public int UserId { get; set; }
    public string UserRole { get; set; }
    public string UserName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

命令

using …
Run Code Online (Sandbox Code Playgroud)

c# t4 code-generation entity-framework

4
推荐指数
1
解决办法
1万
查看次数

使用SSDT作为T4模板的源

我有一个SQL Server数据工具(SSDT)项目,它有许多存储过程,我想生成C#代码以使用T4调用它们.这样做有没有现成的例子?

到目前为止,我可以创建一个每个proc的函数,但我真的希望能够利用SSDT创建的元数据,这样我就可以从中获取参数,数据类型和返回值,而不是进行字符串解析.

.net c# t4 sql-server-data-tools

4
推荐指数
1
解决办法
814
查看次数

什么是'.tt'扩展名?

something.js.tt使用Knockout和一堆something-else.ttHTML文件处理一堆JavaScript 文件.

该基础架构主要是带有Perl服务API的C后端,我们使用这些.tt文件来显示HTML并.js.tt提供Knockout.js代码.什么是.tt

t4 file-extension

4
推荐指数
2
解决办法
5490
查看次数

T4使用DTE打开生成的文件时,Visual Studio序列化错误

我们有一个名为GenerateProxies.tt的C#T4文件,该文件调用了几个命令行代码生成实用程序。使用System.Diagnostics Process类,我们将标准输出重定向到T4输出文本文件(GenerateProxies.txt),以便我们可以查看命令行输出中的错误。

我在T4的末尾添加了以下简单代码,以便Visual Studio将打开生成的文本文件作为该过程的最后一步(该workingDirectory变量在模板的前面进行了声明和填充)。确实可以,但是会引发序列化错误。可以避免此错误吗?

<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
<#
    IServiceProvider vssp = (IServiceProvider)this.Host;
    DTE dte = vssp.GetService(typeof(DTE)) as DTE;
    dte.ItemOperations.OpenFile(
        string.Format(@"{0}\GenerateProxies.txt", workingDirectory),
        Constants.vsViewKindTextView
    );
#>
Run Code Online (Sandbox Code Playgroud)

再次,这确实起作用,它打开了文本文件,但是会产生此错误:

Running transformation: System.Runtime.Serialization.SerializationException:
Type 'Microsoft.VisualStudio.Platform.WindowManagement.DTE.WindowBase' in
Assembly 'Microsoft.VisualStudio.Platform.WindowManagement'
is not marked as serializable.
Run Code Online (Sandbox Code Playgroud)

c# t4 envdte visual-studio-2015

4
推荐指数
1
解决办法
1294
查看次数