【发布时间】:2016-08-22 11:36:26
【问题描述】:
在编写 T4 文本模板的过程中,我遇到了一个难以解决的问题。我需要知道我正在处理的枚举类型。
我有基于byte 和ushort 的枚举。我需要 T4 文本模板编写代码以将枚举转换为正确的值类型,以便序列化枚举并将其放入字节数组中。
这是一个字节类型的示例枚举
namespace CodeEnumType
{
public enum MyEnum : byte
{
Member1 = 0,
Member2 = 1,
}
}
这是我的 T4 文本模板
<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="EnvDte" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.Collections.Generic" #>
<#
var serviceProvider = this.Host as IServiceProvider;
var dte = serviceProvider.GetService(typeof(DTE)) as DTE;
var project = dte.Solution.FindProjectItem(this.Host.TemplateFile).ContainingProject as Project;
var projectItems = GetProjectItemsRecursively(project.ProjectItems);
foreach(var projectItem in projectItems)
{
var fileCodeModel = projectItem.FileCodeModel;
if(fileCodeModel == null)
{
continue;
}
CodeElements codeElements = fileCodeModel.CodeElements;
ProcessCodeElements(codeElements);
}
#>
<#+
public void ProcessCodeElements(CodeElements codeElements)
{
if(codeElements == null)
{
return;
}
foreach(CodeElement codeElement in codeElements)
{
switch(codeElement.Kind)
{
case vsCMElement.vsCMElementNamespace:
CodeNamespace codeNamespace = codeElement as CodeNamespace;
CodeElements childCodeElements = codeNamespace.Members;
ProcessCodeElements(childCodeElements);
break;
case vsCMElement.vsCMElementEnum:
CodeEnum codeEnum = codeElement as CodeEnum;
WriteLine(codeEnum.Name);
//
// here I would like the enum type
//
break;
}
}
}
public IEnumerable<ProjectItem> GetProjectItemsRecursively(ProjectItems items)
{
if(items == null)
{
yield break;
}
foreach(ProjectItem item in items)
{
yield return item;
var childItems = GetProjectItemsRecursively(item.ProjectItems);
foreach(ProjectItem childItem in childItems)
{
yield return childItem;
}
}
}
#>
注意我写的部分
//
// here I would like the enum type
//
我在变量codeEnum 中有我的枚举信息,这就是我的问题所在。如何从codeEnum 获取byte 或ushort 类型?
我在这里没有使用反射,因为如果程序集尚未编译,Type.GetType() 将无法正常工作。
【问题讨论】:
-
为什么要将枚举转换为正确的值类型?
-
什么是
CodeEnum?您实际使用的代码生成技术是 T4 还是 CodeDom?假设Code*引用 CodeDom 类,这似乎是一种奇怪的混合。 -
您可能正在寻找这个:msdn.microsoft.com/en-us/library/… 但是,您的问题是模棱两可的。 T4 / CodeDom / 反射?这些是完全不同的概念。
-
@OndrejTucny 看起来提问者有一个the
EnvDTE.CodeEnumtype 的实例。所以他问如何从中获取底层整数类型,我想。 -
@JeppeStigNielsen 这可能是可能的,但我必须依赖每次更改后已编译一次程序集.. 不是最佳的