Tag: t4

如何禁用写入T4生成输出文件的#line指令

我的T4代码生成遇到了一个小问题。 我已将我的T4模板分解为单独的文件并将它们放在各种目录中,我已经这样做了,因此我的代码生成的一部分可以在多个项目中重复使用,例如模型生成,存储库生成和服务生成都包括核心EntityGeneration .tt文件。 不幸的是,当TextTemplating解析我的嵌套包含时,它会在其生成的.cs文件中构建一个长的#line预处理器指令,将所有相对路径组合到最低级别的包含文件。 不幸的是,由于这条路径是用相对路径构建的,所以它不必要地长了很长时间,实际上它超过了最大路径长度(Windows 7)。 如果您感兴趣,以下是生成代码的错误行: #line 3 “C:\VS2010\AlbatrossTravelGroup\ASC\AlbatrossTravelGroup.ASC.BusinessRules\Services\Contracts\..\..\..\..\AlbatrossTravelGroup.BusinessRules\Services\Contracts\..\..\..\AlbatrossTravelGroup.Models\Repositories\Contracts\..\..\../AlbatrossTravelGroup.Common/CodeGeneration.tt” 我的问题是,如何禁用这些指令写入生成的代码文件? 如果不这样做,如何在不改变文件结构的情况下避免此问题?

T4 – > C#class to Knockout View Model in Typescript

我正在寻找某种T4或类似的方式来获取C#类,并为强大类型的线路和视图模型生成数据的接口。 我发现typelite适用于接口,但我正在寻找能够处理视图模型的东西(或者除此之外) 我发现这个项目看起来很棒: JS的代码项目视图模型 但是当然它会生成javascript,并且在打字时看起来非常简单,包括枚举和inheritance等等,并使其与打字稿一起使用 有谁知道这样做的项目? 如果没有,有关如何构建这个的任何提示? 我不是T4专家,即使使用工具使Visual Studio中的T4编辑不那么糟糕,它看起来也很不可思议。 谢谢!

如何创建一个封装T4模板文本部分的方法?

而不是这个.tt: blah blah blah etc. very complex example with embedded expression like 我想要一个输出函数,它将返回输出等等等等。: blah blah blah etc. very complex example with embedded expression like 当然上面的语法不正确。 这该怎么做 ?

如何使用T4从一个模板同时生成两个文件?

我有一个案例,我需要生成两个CSharp代码文件具有相同的代码但不同的方法的输入和输出类型的命名空间。 事实上,每个文件都针对特定国家/地区,而且类型来自特定国家/地区的WSDL。 我正在围绕服务编写一些包装器,逻辑完全相同,但是从WSDL自动生成的类型是不同的。 我怎样才能减少编码工作量并在一个地方编写逻辑并为两组不同类型生成逻辑?

通用方法可以使用逆变/协变类型吗?

我正在编写一个通用的方法,在T4模板的特殊任务中使用它。 该方法应该允许我使用通用接口中的专用类型。 我想到了以下签名: interface IGreatInterface { Object aMethodAlpha(U parameter) where U : IAnInterface; Object aMethodBeta(IAnInterface parameter) } public class AnInterestingClass : IAnInterface{} 当我尝试实现IGreatInterface ,编译器为aMethodBeta()标记了一个错误,因为我已经让我的T4使用IAnInterface的子类型来编写该方法(即我想实现这样的方法: Object aMethodBeta(AnInterestingClass parameter) )。 方法aMethodAlpha()可以使用,但不是我想要的干净,因为我的T4必须生成一些额外的代码。 我(也许错误地)提出必须由T4完成该方法的实现 Object aMethodAlpha(AnInterestingClass parameter) 。 我认为generics方法不支持逆变类型,但我不确定; 我想这是编译器阻止编码器使用具有未在通用类型中定义的方法的特定类型的方式… 通用方法在实现时是否必须使用确切类型? 有什么技巧可以改变这种行为吗?

生成(通过T4)文件构建操作将重置为Build

我们在Visual Studio 2013中有一个数据库项目。在这个项目中,我们有一个生成.sql脚本的.tt文件。 问题是在生成之后,生成的文件的构建操作自动设置为Build。 如果我们手动将其更改为None,则会在重新生成(运行自定义工具)后重置为Build。 另一个奇怪的事情是,只有.tt文件位于数据库项目和该项目的某个文件夹中(不在root中)才会发生。 如果.tt文件位于另一个项目(任何地方)或数据库项目的根目录中,则生成文件的构建操作在重新生成后不会更改。 我们没有任何Visual Studio加载项,我尝试禁用可以禁用的所有扩展和更新。 如果需要,我会给你任何细节。

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

我正在寻找一种方法来提高生产力,当我向我的数据库添加一个表。 通常,当我添加新表时,我必须执行以下步骤。 将表添加到数据库(简单) 创建相应的EF Code First类。 (我不使用db迁移) 创建一个匹配#2中创建的EF类的POCO模型。 创建存储库类 为CQRS模式创建命令和处理程序 为新创建的类创建AutoMapper映射 我最近创建了一个新网站,其中要求首先使用EF数据库,我看到它是如何使用tt文件生成类的。 这让我想到我可以以某种方式使用这些模板(新的模板)来生成基本CRUD操作的所有标准支持项。 麻烦的是我没有创建这些模板的经验,也不知道从哪里开始。 要生成的示例代码: 知识库 using System; using System.Collections.Generic; using System.Linq; using System.Text; public interface IUsersRepository : IRepository { } public class UsersRepository : RepositoryBase, IUsersRepository { public UsersRepository(IDatabaseFactory databaseFactory) : base(databaseFactory) { } } 基于EDMX(或Code First)生成的实体的基本模型 using System; using System.Collections.Generic; using System.Linq; using […]

代码生成器或T4模板,它们真的很邪恶吗?

我听说人们说不应该使用代码生成器和T4模板。 这背后的逻辑是,如果您使用生成器生成代码,那么通过generics和模板构建代码有一种更好的更有效的方法。 虽然我略微同意上面的这个陈述,但我还没有真正找到有效的方法来构建模板,例如可以说实例化自己。 换句话说,我永远做不到: return new T(); 另外,如果我想基于数据库值生成代码,我发现将Microsoft.SqlServer.Management.SMO与T4模板结合使用可以很好地生成大量代码而无需复制/粘贴或使用resharper。 我在Generics中发现的许多问题都是令我震惊的是,有很多开发人员不了解它们。 当我为一个解决方案检查generics时,有时它会变得复杂,因为C#表明你不能做一些在我脑海里看似合乎逻辑的事情。 你的想法是什么? 你喜欢建造发电机,还是更喜欢使用仿制药? 此外,仿制药可以走多远? 我对generics有很多了解,但是我总是遇到陷阱和陷阱导致我使用T4模板。 处理需要大量灵活性的场景的更合适的方法是什么? 哦,作为这个问题的奖励,C#和Generics的优秀资源是什么?

T4获取解决方案的当前工作目录

我在Visual Studio 2010中使用T4,我想在我的解决方案中迭代文件,但是我发现T4源代码生成在一种沙箱中,当前工作目录在Visual Studio 10目录中在程序文件中。 有没有办法相对地引用T4文件的解决方案,以便它不会破坏构建,或者在没有相同文件结构的其他人的框中工作? 谢谢

如何在.NET Standard项目中使用EnvDTE

我正在将.net 4.7项目移植到.net标准,它使用T4生成一些代码。 我迭代了类,属性和方法。 这种用法可以很好地工作,但是现在DTE的返回类型是’System .__ ComObject’类型,我无法强制转换它们。 错误:无法将“System .__ ComObject”类型的COM对象强制转换为接口类型“EnvDTE.CodeClass”。 此操作失败,因为对于具有IID'{B1F42514-91CD-4D3A-8B25-A317D8032B24}的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(来自HRESULT的exception:0x80004002(E_NOINTERFACE)) 。 任何想法如何解决这一问题? 例: public static bool CheckBase(CodeClass codeClass, string baseName) { var bases = codeClass.Bases; if (bases != null) { foreach (CodeClass baseClass in bases) { if(baseClass.Name == baseName) return true; } } return false; }