C# 从T4模板中的CodeProperty检索属性类型

C# 从T4模板中的CodeProperty检索属性类型,c#,visual-studio,code-generation,envdte,C#,Visual Studio,Code Generation,Envdte,我使用T4实现了一些相当直接的代码生成,但是当涉及到属性生成的细节时,我遇到了一个基本问题。当我访问要生成的CodeProperty对象的Type属性时,它们返回的是“System.\uu ComObject”,而不是属性的实际类型 我使用EnvDTE查找项目中包含自定义属性的所有类。我用它来标记代码生成的某些类。到现在为止,一直都还不错。然后,我将遍历所有属于我的类的子类的CodeElement对象。我可以找到所有的属性,只是我不能得到它们的“类型” 以下是我的T4的一个片段: public

我使用T4实现了一些相当直接的代码生成,但是当涉及到属性生成的细节时,我遇到了一个基本问题。当我访问要生成的CodeProperty对象的Type属性时,它们返回的是“System.\uu ComObject”,而不是属性的实际类型

我使用EnvDTE查找项目中包含自定义属性的所有类。我用它来标记代码生成的某些类。到现在为止,一直都还不错。然后,我将遍历所有属于我的类的子类的CodeElement对象。我可以找到所有的属性,只是我不能得到它们的“类型”

以下是我的T4的一个片段:

public class <#= cls.Name #>_DTO
{
<#
    foreach (CodeElement child in cls.Children)
    {
        if (child.Kind == vsCMElement.vsCMElementProperty)
        {
            var prop = child as CodeProperty;
#>

    public <#= prop.Type.ToString() + " " + child.Name #> { get; set; }

<#
    }
  }
}
#>
如您所见,我已接近有效输出,这正是我正在努力访问的属性类型。

查看文档,我怀疑您希望
AsString
而不是
ToString()
。这将要求:

AsString以建模语言返回CodeTypeRef的字符串表示形式。例如,如果vsCMTypeRef类型是vsCMTypeRefInt,那么对于Visual C,字符串将是“Int”,对于Visual Basic,字符串将是“Long”


我自己从来没有写过这样的代码,所以我只是浏览一下文档,但值得一试:)

成功了:)EnvDTE显然是一个有用的工具,它打开了很多东西,但它不是最直观的库。我也帮了忙!一个小提示:AsString是一个属性而不是一个方法。
public class TestResult_DTO
{
    public System.__ComObject TestType { get; set; }
}