【问题标题】:Retrieving property type from CodeProperty in T4 template从 T4 模板中的 CodeProperty 检索属性类型
【发布时间】:2014-04-04 03:34:43
【问题描述】:

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

我正在使用 EnvDTE 查找项目中包含我的自定义属性的所有类。我正在使用它来标记某些类以进行代码生成。到目前为止,一切都很好。然后,我将遍历作为我班级子级的所有 CodeElement 对象。我可以找到所有属性,只是我无法获取它们的“类型”。

这是我的 T4 的 sn-p:

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; }

<#
    }
  }
}
#>

输出的一个样本是:

public class TestResult_DTO
{
    public System.__ComObject TestType { get; set; }
}

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

【问题讨论】:

    标签: c# visual-studio code-generation envdte


    【解决方案1】:

    查看文档,我怀疑您想要AsString 而不是ToString()。那将调用CodeTypeRef.AsString

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

    我自己从未编写过这种代码,所以我只是按照文档进行,但值得一试:)

    【讨论】:

    • 成功了 :) EnvDTE 显然是一个有用的工具,它打开了很棒的东西,但它不是最直观的库。
    • 也帮助了我!一个小提示:AsString 是一个属性而不是一个方法。
    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多