Учитывая строку, обозначающую тип, мне нужно знать, является ли это значение или ссылочный тип - PullRequest
1 голос
/ 27 сентября 2011

Я пишу шаблон T4 и застрял на этом.Если потребители шаблона пишут:

Please generate stuff for: string myString

Мне нужно сгенерировать

if (myString != null)
{
    DoStuffWith(myString)
}

Тогда как, если они пишут

Please generate stuff for: int myInt

Мне нужно сгенерировать просто

DoStuffWith(myInt)

И это также должно работать с пользовательскими значениями / ссылочными типами.

Если я заставлю потребителей шаблонов писать System.String myString или System.Int32 myInt, я думаю, что это можно было бы сделать без проблем;есть предположительно какой-то метод GetTypeFromFullTypeName, который где-то скрытНо я не хочу заставлять их делать это.

Есть какие-нибудь идеи о том, как мой шаблон T4 мог бы получить эту информацию, чтобы я мог условно сгенерировать правильный код?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011
  1. Получить соответствующий экземпляр класса Type (т. Е. Type.GetType или Assembly.GetType).

  2. Проверьте свойство IsValueType.

Количество типов с "короткими именами" очень ограничено, на самом деле это ключевые слова C #. Таким образом, вы можете использовать регистр, например, case "string": return typeof (string);

Вам также понадобятся некоторые правила для ? и для поиска конкретной конкретной версии универсальных классов (рекурсия будет полезна). Не пытайтесь перевести int? в System.Nullable``1[System.Int32], вместо этого используйте typeof(System.Nullable<>).MakeGenericType(FindType("int")).

1 голос
/ 27 сентября 2011

Вы можете выдавать нулевую проверку всегда, даже для типов значений. Это не ошибка компилятора, но выдает предупреждение , которое вы можете подавить :

#pragma warning disable CS0472 
if (myInt != null)
{
    DoStuffWith(myInt)
}
#pragma warning restore CS0472 
...