我正在使用 T4 生成一些类定义,并发现我的字段名称前面有一个下划线。
我已经设定
code.CamelCaseFields = true;
只是为了安全起见(尽管我知道这是默认设置),但最终还是使用 _myField 而不是 myField。
如何生成没有“_”字符的字段名称?
另外,T4 的文档在哪里?我找到了很多资源,例如
代码生成和文本模板以及许多博客,但我还没有找到逐个类、逐个属性的文档。
我正在使用 T4 生成一些类定义,并发现我的字段名称前面有一个下划线。
我已经设定
code.CamelCaseFields = true;
只是为了安全起见(尽管我知道这是默认设置),但最终还是使用 _myField 而不是 myField。
如何生成没有“_”字符的字段名称?
另外,T4 的文档在哪里?我找到了很多资源,例如
代码生成和文本模板以及许多博客,但我还没有找到逐个类、逐个属性的文档。
您可能在谈论 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 中生成代码的通用嵌入式方式。
我编写了以下方法来使第一个字符大写,删除空格/下划线并使下一个字符大写。请参阅下面的示例。随意使用。
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
这是一个很好的建议,但它并不能帮助您了解放置此类功能的正确位置......
是否有关于分解 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...