Получить универсальный тип из представления строковых значений в разных библиотеках

1

У меня есть 3 типа из разных dll. Y не может найти, как хранить в строке общий тип и как создать экземпляр:

Type type1 = GetType1();
Type type2 = GetType2();
string strClassGenericType = "Namespace.ClassName<,>, DllName";

Type template = // How to get the generic template type?

Type genericType = template.MakeGenericType(new[] { type1, type2 });
object instance = Activator.CreateInstance(genericType);

Я не уверен, соответствует ли это моему требованию.

  • 0
    вы пытаетесь получить тип строки?
  • 0
    Нет, мне нужно создать тип, представленный в строковом значении.
Показать ещё 2 комментария
Теги:
generics
reflection
types

4 ответа

1
Лучший ответ

И vcsjones, и абатищев имеют правильный ответ, но вы пропустите о DLL.

Благодаря vcsjones я использовал это:

string strGenericType = "Namespace.ClassName'2, DllName";
Type template = Type.GetType(strGenericType);

Type genericType = template.MakeGenericType(new[] { type1, type2 });
object instance = Activator.CreateInstance(genericType);

Благодаря абатищеву это короче:

string strGenericType = "Namespace.ClassName'2[[Namespace1.Type1, Type1DllName],[Namespace2.Type2, Type2DllName]], DllName";
Type genericType = Type.GetType(strGenericType);

object instance = Activator.CreateInstance(genericType);
2

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

Console.WriteLine(typeof (Tuple<,>).FullName); //For information only, outputs "System.Tuple'2"
var typeName = "System.Tuple'2";
var type = Type.GetType(typeName);
var generic = type.MakeGenericType(typeof (string), typeof (int));
Console.WriteLine(generic.FullName); //Outputs the type with the type parameters.
  • 1
    или Console.WriteLine(typeof(Tuple<,>).AssemblyQualifiedName) для получения дополнительной информации и лучшего понимания.
1

Правильное строковое представление общего типа выглядит так:

"System.Collections.Generic.Dictionary'2[[System.String],[System.Object]]"

Где '2 означает количество параметров типового типа.

Полностью квалифицированное имя типа см. В скрипке.


Если вы ищете универсальный тип, не имеющий общих параметров типа, указанных (так называемый открытый общий), тогда это:

"System.Collections.Generic.Dictionary'2, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
  • 0
    Я думаю, что он спрашивает, как взять имя типа, которое вообще не имеет параметров типа, таких как Dictionary`2 , а затем во время выполнения указать параметры типа с помощью MakeGenericType .
  • 0
    Спасибо за информацию, это более полезно для моего требования, но ответ vcsjones немного более дидактичен.
0

Полагаю, вы пытаетесь создать тип из строкового значения.

Пытаться:

Type type = Type.GetType("System.String");

например, для создания типа текстового поля из строки:

Type.GetType("System.Windows.Forms.TextBox, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

См. MSDN.

  • 0
    Мне нужен универсальный тип.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню