【问题标题】:T4 FieldName in camelCase without Underscore?没有下划线的camelCase中的T4 FieldName?
【发布时间】:2011-02-26 01:29:35
【问题描述】:

我正在使用 T4 生成一些类定义,发现我的字段名前面有一个下划线。

我已经设置了

code.CamelCaseFields = true;

为了安全起见(尽管我知道这是默认设置),但最终还是使用 _myField 而不是 myField。

如何生成不带“_”字符的字段名称?

另外,T4 的文档在哪里?我找到了很多资源,例如

Code Generation and Text Templates 和许多博客,但我没有找到逐类、逐属性的文档。

【问题讨论】:

    标签: t4 camelcasing


    【解决方案1】:

    您可能在谈论 EF4 自我跟踪实体。 CodeGenerationTools 类是通过 <#@ include file="EF.Utility.CS.ttinclude"#> 指令包含的,您可以在“[VSInstallDir]\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\Templates\Includes\EF.Utility.CS.ttinclude”中找到该指令。

    FieldName 函数是这样定义的:

    private string FieldName(string name)
    {
      if (CamelCaseFields)
      {
        return "_" + CamelCase(name);
      }
      else
      {
        return "_" + name;
      }
    }
    

    “_”在函数中是硬编码的。自己编写代码应该不难。请注意,CodeGenerationTools 类是特定于此 ttinclude 文件的,不是在 T4 中生成代码的通用嵌入式方式。

    【讨论】:

      【解决方案2】:

      我编写了以下方法来将第一个字符变为大写,删除空格/下划线并将下一个字符变为大写。请参阅下面的示例。随意使用。

      private string CodeName(string name)
      {
          name = name.ToLowerInvariant();
      
          string result = name;
          bool upperCase = false;
      
          result = string.Empty;
          for (int i = 0; i < name.Length; i++)
          {
              if (name[i] == ' ' || name[i] == '_')
              {
                  upperCase = true;
              }
              else
              {
                  if (i == 0 || upperCase)
                  {
                      result += name[i].ToString().ToUpperInvariant();
                      upperCase = false;
                  }
                  else
                  {
                      result += name[i];
                  }
              }
          }
      
          return result;
      }
      

      输入/输出样本: first_name = 名字, 身份证=身份证, 状态消息 = 状态消息

      【讨论】:

        【解决方案3】:

        这是一个很好的建议,但它并不能帮助您了解放置此类函数的正确位置......

        是否有任何关于分解 EF .tt 文件或逐步生成输出以查看它如何构建输出的指导?

        通过将上述函数插入一个名为 (Ef4.3)

        公共字符串属性(EdmProperty edmProperty)

        这似乎用于输出“public int fieldname { get; set; }”之类的行

        并将第三个(索引 {2})参数更改为格式以使用修改名称的函数进行包装,如下所示:

        _typeMapper.GetTypeName(edmProperty.TypeUsage), //unchanged
        UnderScoreToPascalCase(_code.Escape(edmProperty)), //wrapped "name"
        _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), // unchanged
        

        这并不完美,例如:它不保留现有的“Ucasing”并且不关心这样的事情: 客户IP 输出:Customerip 哪个 IMO 不太可读...

        但它比我看到的噩梦要好,因为数据库混杂了驼峰式、PascalCase 和下划线分隔的混乱,太可怕了。

        无论如何希望这对某人有所帮助......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多