3

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

我已经设定

code.CamelCaseFields = true;

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

如何生成没有“_”字符的字段名称?

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

代码生成和文本模板以及许多博客,但我还没有找到逐个类、逐个属性的文档。

4

3 回答 3

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 中生成代码的通用嵌入式方式。

于 2010-05-31T17:22:20.987 回答
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

于 2011-03-03T10:26:50.610 回答
0

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

是否有关于分解 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”并且不关心这样的事情:customerIP输出:IMO不太可读的Customerip......

but its better than what I WAS looking at which was a nightmare because the database was intermingled mess of camelCase, PascalCase and underscore separation, so pretty horrific.

anyway hope this helps someone...

于 2014-03-07T02:43:14.387 回答