不能在 T4 模板中使用 DisplayAttribute

Can not use DisplayAttribute in T4 template

提问人:theGhostN 提问时间:1/29/2023 最后编辑:theGhostN 更新时间:1/31/2023 访问量:79

问:

在我的自定义 T4 模板中,我必须阅读 .但是在为几种解决方案而苦苦挣扎之后,我不断遇到不同的错误。 这是我文件的一部分:DisplayAttributetype.tt

<#@ template debug="true" hostspecific="true" language="C#" compilerOptions="/langversion:10" #>
<#@ assembly name="System" #>
<#@ assembly name="System.Runtime" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.ComponentModel.Annotations" #>

<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Runtime" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.ComponentModel.DataAnnotations" #> 
<#@ output extension=".cs" #>

<#
    static string GetEnumValueDisplayName(Enum value)
    {
        Type type = value.GetType();
        MemberInfo[] memInfo = type.GetMember(value.ToString());
        DisplayAttribute? dispalyAttribute = null;
        if (memInfo != null && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(DisplayAttribute), false);

            if (attrs != null && attrs.Length > 0)
                dispalyAttribute = attrs[0] as DisplayAttribute;
        }
        return dispalyAttribute?.Name ?? "";
    }
#>


<#
 foreach(myEnum en in Enum.GetValues(typeof(MyEnum)))
 {#>
          public static class <#[email protected]()#> { public const string Value = "<#[email protected]()#>";public const string Text = "<#=@GetEnumValueDisplayName(en)#>";}
<#}#>

这是我的编译时错误:

编译转换:类型名称“DisplayAttribute”无法 在命名空间“System.ComponentModel.DataAnnotations”中找到。 此类型已转发到程序集 'System.ComponentModel.DataAnnotations,版本 = 4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 考虑添加一个 对该程序集的引用。

我正在将 .net 6 与 Visual Studio 2022(17.0.4) 一起使用。

C# .NET 代码生成 T4 文本模板

评论

0赞 Lennart 1/30/2023
VS 22 17.0.4 是 2021 年的,有什么特别的原因无法更新吗?
0赞 theGhostN 1/30/2023
@Lennart 我不认为它与 VS 版本有任何关系,因为 T4 已经存在了很多年。

答:

0赞 Karen Payne 1/30/2023 #1

删除并添加到常规 using 语句中。<#@ assembly name="System.ComponentModel.Annotations" #>using System.ComponentModel.DataAnnotations;

enter image description here

评论

0赞 theGhostN 1/30/2023
这不是答案。我更新了代码以使其更准确。我想将 DisplayNameAttribute 用作生成代码的一部分,而不是作为生成代码的一部分。
0赞 mgoertz-MSFT 1/31/2023 #2

我正在使用 .net 6

那将是一个问题。VS T4 引擎目前仅支持 .NET Framework,这意味着它在转换期间无法加载任何 .NET Core 库。我们已开始开发该引擎的 .NET Core 版本,但尚未确定何时可用。任何更新都将通过此建议票进行传达。