我一直在搞乱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,但我得到了一个NotImplementedException
我正在尝试编写一个需要登录FB以获取文档的T4模板.要做到这一点,我需要引用第三方DLL.可以这样做,如果是这样,怎么办?
我有一个修改过的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)
但是我收到了语法错误,所以我想看看是否还有其他人试过这个,如果我走的是正确的道路
我在 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并且第一次相处得很好,但后来遇到了一个实际上非常明显并且可能无法解决的问题,但也许有一种方法我只是缺乏了解或看到的经验.
鉴于以下课程:
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) 我编写了这个帮助器方法来从类中获取属性,但它也获取了私有属性.我怎样才能获得公共财产?
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/
我正在寻找一种方法来提高生产力,当我向我的数据库添加一个表.通常,当我添加新表时,我必须执行以下步骤.
我最近创建了一个新网站,其中要求首先使用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) 我有一个SQL Server数据工具(SSDT)项目,它有许多存储过程,我想生成C#代码以使用T4调用它们.这样做有没有现成的例子?
到目前为止,我可以创建一个每个proc的函数,但我真的希望能够利用SSDT创建的元数据,这样我就可以从中获取参数,数据类型和返回值,而不是进行字符串解析.
我something.js.tt使用Knockout和一堆something-else.ttHTML文件处理一堆JavaScript 文件.
该基础架构主要是带有Perl服务API的C后端,我们使用这些.tt文件来显示HTML并.js.tt提供Knockout.js代码.什么是.tt?
我们有一个名为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)