代码之家  ›  专栏  ›  技术社区  ›  Eric J.

T4字段名在camelcase中不带下划线?

  •  3
  • Eric J.  · 技术社区  · 14 年前

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

    我已经定好了

    code.CamelCaseFields = true;
    

    只是为了安全(即使我知道这是默认值),但最终还是以“我的领域”而不是“我的领域”结束。

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

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

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

    3 回复  |  直到 10 年前
        1
  •  3
  •   Julien Lebosquain    14 年前

    你可能在谈论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;
      }
    }
    

    函数中的“u”是硬编码的。编写自己的代码并不难。请注意 代码生成工具 类是特定于此ttinclude文件的,不是在t4中生成代码的通用和嵌入式方法。

        2
  •  2
  •   Dan Pettersson    13 年前

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

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

    输入/输出样本: 名字=名字, ID= status message=状态消息

        3
  •  0
  •   nojedi    10 年前

    这是一个很好的建议,但是它并不能帮助你知道把这样一个函数放在哪里…

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

    通过将上述函数插入名为 (EF4.3)

    公共字符串属性(EdmProperty EdmProperty)

    它似乎用于输出“public int fieldname get;set;”等行。

    并将第三个(index 2)参数更改为格式化,以便用函数包装以修改名称,如下所示:

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

    这是不完美的,例如:它不保持现有的“增长”,也不关心这样的事情: 客户IP 输出:customerip 在我看来,这是不太可读的…

    但它比我所看到的要好,因为数据库混合了大量的骆驼壳、帕斯卡酶和强调分离,非常可怕。

    无论如何,希望这能帮助别人…