У меня есть 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);
Я не уверен, соответствует ли это моему требованию.
И 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);
В конкретном случае, когда вы хотите, чтобы тип объекта, который не имеет его, определяет известные параметры, вы можете использовать обратную линию с количеством параметров типа. Вот пример с 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.
Console.WriteLine(typeof(Tuple<,>).AssemblyQualifiedName)
для получения дополнительной информации и лучшего понимания.
Правильное строковое представление общего типа выглядит так:
"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"
Dictionary`2
, а затем во время выполнения указать параметры типа с помощью MakeGenericType
.
Полагаю, вы пытаетесь создать тип из строкового значения.
Пытаться:
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.