2010-05-31 2 views
3

Я использую T4 для генерации определений классов и обнаруживаю, что получаю знак подчеркивания перед именами полей.T4 Полевое имя в camelCase без подчеркивания?

Я поставил

code.CamelCaseFields = true; 

просто, чтобы быть безопасным (хотя я понимаю, что это по умолчанию), но до сих пор в конечном итоге с _myField, а не MyField.

Как создать имя поля без символа '_'?

Кроме того, где находится документация для T4? Я нахожу много ресурсов, таких как

Code Generation and Text Templates и множество блогов, но я не нашел документацию по классам по отдельности.

ответ

3

Возможно, вы говорите об объектах самообучения EF4. Класс CodeGenerationTools включен в директиву <#@ include file="EF.Utility.CS.ttinclude"#>, который вы можете найти в разделе «[VSInstallDir] \ Common7 \ IDE \ Extensions \ Microsoft \ Entity Framework Tools \ Templates \ Includes \ EF.Utility.CS.ttinclude".

Функция Имя_поля определяется как таковую:

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 = FirstName, ID = Id, статусное сообщение = StatusMessage

0

Это хороший совет, однако это не поможет вам узнать, где право место для размещения такая функция ...

Есть ли какие-либо указания относительно DECOMPOSING файлов EF .tt или выхода из поколения вывода, чтобы увидеть, как он создает выход?

Я был в состоянии успешно использовать описанную выше функцию, подключив его в функцию под названием (Ef4.3)

общественная строка Свойство (EdmProperty edmProperty)

который, кажется, используется для вывода строки как «общественный ИНТ имя_поль {получить, установить;}»

и изменил 3-й (индекс {2}) параметры к форматированию, чтобы обернуть с функцией, чтобы изменить название, например:

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

Это не идеальный вариант, например: он не сохраняет существующие «Ucasing» и не заботится о таких вещах: customerIP выходы: Клиент , который IMO не очень читабельн ...

, но это лучше, чем я смотрел на то, что было кошмаром, потому что база данных была смешана с беспорядком camelCase, PascalCase и подчеркиванием разделения, что довольно ужасно.

в любом случае надеется, что это поможет кому-то ...

Смежные вопросы