C# T4项目之间的复制枚举

C# T4项目之间的复制枚举,c#,.net,t4,C#,.net,T4,我的解决方案中有两个项目。我需要将值从Project1中的enum1复制到project2中的enum2。这是否可能使用T4 编辑 让我更好地描述一下我的情况。enum1所在的project1由工具生成。大多数实体是由数据库和表名枚举生成的。此project1在服务器端用于与数据库交互。服务器端通过WCF与客户端进行通信。在分离的问题上,我不想通过WCF共享我的项目1。但有一个枚举具有实体名称。我使用客户端的实体名称使一些任务成为通用任务。例如,我通过WCF Client->Server发送了一

我的解决方案中有两个项目。我需要将值从Project1中的enum1复制到project2中的enum2。这是否可能使用T4

编辑


让我更好地描述一下我的情况。enum1所在的project1由工具生成。大多数实体是由数据库和表名枚举生成的。此project1在服务器端用于与数据库交互。服务器端通过WCF与客户端进行通信。在分离的问题上,我不想通过WCF共享我的项目1。但有一个枚举具有实体名称。我使用客户端的实体名称使一些任务成为通用任务。例如,我通过WCF Client->Server发送了一些值,并使用实体名称将这些值映射到适当的实体

首先,是的,您可以构建一个T4模板,在一个项目中读取您的枚举,然后将它们添加到另一个项目中

但是,您可能不想这样做

但是,如果您这样做了,还有一种更简单的方法,您只需将原始enum文件作为链接添加到第二个项目中。通过添加一个链接,您实际上并没有制作文件的副本,您只是在另一个项目中链接回它,然后就不需要再处理T4了。但是,这假设您不想以任何方式更改进程中的枚举

要添加链接,只需单击“添加现有项”,通常导航到原始枚举文件,但在“添加”按钮上,有一个小的下拉菜单,其中包含链接菜单项。使用此选项,您将看到新文件在解决方案资源管理器中的图标上覆盖了一个小链接符号,表示它是一个链接

但是,我说您可能不想这样做的原因是,即使您将整个枚举文件从一个项目复制到另一个项目,这两个枚举的类型也不相同

换句话说,如果您在一个项目中需要调用另一个项目中的代码,那么在调用项目B中声明为使用项目B中的枚举的代码时使用项目A中的枚举将不起作用,它们是不同的类型。程序集是类型标识的一部分


如果需要这样做,您需要在项目A或B中声明枚举,并在另一个项目中引用该项目,或者在第三个项目中声明它,并在A和B中引用该第三个项目。

首先,是的,您肯定可以构建一个T4模板来读取一个项目中的枚举,并将它们添加到另一个项目中

但是,您可能不想这样做

但是,如果您这样做了,还有一种更简单的方法,您只需将原始enum文件作为链接添加到第二个项目中。通过添加一个链接,您实际上并没有制作文件的副本,您只是在另一个项目中链接回它,然后就不需要再处理T4了。但是,这假设您不想以任何方式更改进程中的枚举

要添加链接,只需单击“添加现有项”,通常导航到原始枚举文件,但在“添加”按钮上,有一个小的下拉菜单,其中包含链接菜单项。使用此选项,您将看到新文件在解决方案资源管理器中的图标上覆盖了一个小链接符号,表示它是一个链接

但是,我说您可能不想这样做的原因是,即使您将整个枚举文件从一个项目复制到另一个项目,这两个枚举的类型也不相同

换句话说,如果您在一个项目中需要调用另一个项目中的代码,那么在调用项目B中声明为使用项目B中的枚举的代码时使用项目A中的枚举将不起作用,它们是不同的类型。程序集是类型标识的一部分


如果需要这样做,您需要在项目A或B中声明枚举,并在另一个项目中引用该项目,或者在第三个项目中声明枚举,并在A和B中引用该第三个项目。

也许您可以创建模板,从一个项目中读取文件,并在包含tt的项目中写入。如果要在同一点上使用两个项目,请不要忘记更改类型的命名空间

tt:

<#@ template hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>

<#             
var path=@"..\Domain.Model\MyEnum.cs";
path = this.Host.ResolvePath(path);

var content = File.ReadAllText(path);

// mental note: learn regex once for all¡¡¡
content=content.Replace("namespace Domain.Model", "namespace Domain.Dtos"); #>

<#=content#>

也许您可以创建模板,从一个项目中读取文件,然后写入包含tt的项目中。如果要在同一点上使用两个项目,请不要忘记更改类型的命名空间

tt:

<#@ template hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>

<#             
var path=@"..\Domain.Model\MyEnum.cs";
path = this.Host.ResolvePath(path);

var content = File.ReadAllText(path);

// mental note: learn regex once for all¡¡¡
content=content.Replace("namespace Domain.Model", "namespace Domain.Dtos"); #>

<#=content#>

你为什么要这么做?您确定不想在一个地方(即第三个项目)声明它们并在其他两个地方引用它们吗?请注意,如果在两个不同的项目中定义了完全相同的枚举,则不能将它们混合,它们仍然被视为不同的类型。添加了一个答案,其中包含一些详细信息。为什么需要这样做?您确定不想在一个地方(即第三个项目)声明它们并在其他两个地方引用它们吗?请注意,如果在两个不同的项目中定义完全相同的枚举,则可以
不要把它们混在一起,它们仍然被认为是不同的类型。添加了一个答案,而不是一些更多的信息。请查看我的帖子我添加了更多信息。请查看我的帖子我添加了更多信息。