Генерация кода - есть ли простой способ получить правильное строковое представление обнуляемого типа? - PullRequest
2 голосов
/ 17 марта 2010

Итак, я создаю приложение, которое будет выполнять тонну генерации кода с выходами C # и VB (в зависимости от настроек проекта).

У меня есть CodeTemplateEngine с двумя производными классами VBTemplateEngine и CSharpTemplateEngine. Этот вопрос касается создания подписей свойств на основе столбцов в таблице базы данных. Используя метод GetSchemaTable IDataReader, я собираю тип CLR столбца, например «System.Int32», и определяет, является ли он IsNullable. Тем не менее, я хотел бы сохранить код простым, и вместо того, чтобы иметь свойство, которое выглядит следующим образом:

    public System.Int32? SomeIntegerColumn { get; set; }

или

    public Nullable<System.Int32> SomeIntegerColumn { get; set; },

где тип свойства будет разрешен с помощью этой функции (из моего VBTemplateEngine),

    public override string ResolveCLRType(bool? isNullable, string runtimeType)
    {
        Type type = TypeUtils.ResolveType(runtimeType);
        if (isNullable.HasValue && isNullable.Value == true && type.IsValueType)
        {
            return "System.Nullable(Of " + type.FullName + ")";
            // or, for example...
            return type.FullName + "?";
        }
        else
        {
            return type.FullName;
        }
    },

Я хотел бы создать более простое свойство. Я ненавижу идею создания строки типа из ничего, и я предпочел бы что-то вроде:

    public int? SomeIntegerColumn { get; set; }

Есть ли что-нибудь встроенное где-нибудь, например, в классах VBCodeProvider или CSharpCodeProvider, которые как-то позаботятся об этом для меня?

Или есть способ получить псевдоним типа int? из строки типа, такой как System.Nullable'1[System.Int32]?

Спасибо!

UPDATE:

Нашел что-то , что подойдет, но я по-прежнему настороженно отношусь к тому типу сопоставления полных имён Type с их псевдонимами.

Ответы [ 2 ]

4 голосов
/ 17 марта 2010

Вы можете сделать это, используя поддержку CodeDom для универсальных типов и метод GetTypeOutput:

CodeTypeReference ctr;
if (/* you want to output this as nullable */)
{
  ctr = new CodeTypeReference(typeof(Nullable<>));
  ctr.TypeArguments.Add(new CodeTypeReference(typeName));
}
else
{
  ctr = new CodeTypeReference(typeName);
}
string typeName = codeDomProvider.GetTypeOutput(ctr);

Это будет относиться к ключевым словам типа языка, таким как C # int или VB Integer, хотя все равно даст вам System.Nullable<int> вместо int?.

2 голосов
/ 17 марта 2010

Здесь есть два вопроса:

  1. System.Int32 имеет псевдоним C # int, который вы предпочитаете.
  2. System.Nullable можно указать с помощью символа ? в C #, который вы предпочитаете.

В .NET Framework нет методов, учитывающих их при преобразовании имени типа в строку. Тебе придется катиться самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...