没有下划线的camelCase中的T4 FieldName?

时间:2010-05-31 17:06:50

标签: t4 camelcasing

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

我已经设置了

code.CamelCaseFields = true;

只是为了安全(即使我理解这是默认设置)但仍然以_myField而不是myField结束。

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

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

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

3 个答案:

答案 0 :(得分:3)

您可能正在谈论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中生成代码的通用和嵌入方式。

答案 1 :(得分: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 = FirstName, id = Id, 状态消息= StatusMessage

答案 2 :(得分:0)

这是一个很好的建议,但它不能帮助你知道哪里放置这样一个功能的正确位置......

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

通过将其插入到一个名为的函数中,我成功地使用了上述函数 (Ef4.3)

public string Property(EdmProperty edmProperty)

这似乎用于输出像“public int fieldname {get; set;}”

这样的行

并将第3个(索引{2})参数更改为格式化以包装函数以修改名称,如下所示:

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

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

但它比我所看到的更好,这是一场噩梦,因为数据库混杂了camelCase,PascalCase和下划线分离,所以非常可怕。

无论如何希望这有助于某人...