Как повторно использовать возвращаемое значение типа для создания нового исходного кода

У меня есть проблема:

Я хочу создать новый файл исходного кода из информации об объекте.

Я делаю что-то вроде этого:

dictParamMapping — это Dictionary<string, Type>, где строка — это имя переменной, а Type — тип этой переменной.

Я получаю тип для создания нового кода, используя:

dictParamMapping[pairProcess.Value].Type.Name (or FullName)

Когда тип - int, string, datatable и т.д... все работает нормально, но когда это словарь, список или что-то подобное, он возвращает что-то вроде:

System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Double, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

Что неправильно для создания этого нового исходного кода. Я хотел бы получить что-то вроде Dictionary<int, double>

Может кто-нибудь помочь мне?


person pasapepe    schedule 02.07.2012    source источник
comment
Изучили ли вы GetGenericTypeDefinition и GetGenericArguments?   -  person O. R. Mapper    schedule 02.07.2012
comment
Итак, вы хотите получить псевдоним C# для примитивных типов?   -  person abatishchev    schedule 02.07.2012
comment
Абатищеву: Да, это мысль. К O. R. Mapper: GetGenericArguments возвращает мне тип внутреннего типа, но когда структура данных, такая как Dictionary‹int, List‹int››, вынуждает меня создавать рекурсивную функцию для ее обнаружения.   -  person pasapepe    schedule 02.07.2012


Ответы (2)


Похоже, вы хотите получить C#-совместимое имя из файла System.Type. Это можно сделать с помощью класса CSharpCodeProvider.

var typeReference = new CodeTypeReference(typeof(Dictionary<int, double>));

using (var provider = new CSharpCodeProvider())
    Console.WriteLine(provider.GetTypeOutput(typeReference));

Выход:

System.Collections.Generic.Dictionary<int, double>

Обратите внимание, что это не гарантирует, что вы всегда получите действительное имя типа. В частности, типы, созданные компилятором (например, для замыканий), обычно имеют имена типов, недопустимые в C#.

person Ani    schedule 02.07.2012

Это не идеальный способ создания исходного кода в .NET. Есть официально поддерживаемые способы сделать это.

API, предоставляемый платформой, называется CodeDOM. Вы можете изучить документацию и примеры, чтобы понять, на что он способен. Вот пример запуска, показывающий, как создать класс. CodeDOM поддерживает как C#, так и VB.NET в качестве выходных языков.

person Marcel N.    schedule 02.07.2012