2016-12-02 7 views
0

У меня есть проблема с использованием динамических типов для создания экземпляра пользовательского класса. Пример, у меня есть следующий класс:Создание экземпляра динамического типа

public class myClass<T> 
{ 
    public myClass(String header); 
} 

Если я использую следующий код, все работает отлично:

var myInstance = new myClass<int>("myHeader"); 

Однако, я нахожусь в положении, не имеют int тип, определенный , поэтому мне нужно динамически отливать его от параметра общего типа. То, что я пытался до сих пор:

1.

Type myType = typeof(int); 
    var myInstance = new myClass<myType>("myHeader"); 

2.

int myInt = 0; 
    Type myType = myInt.GetType(); 
    var myInstance = new myClass<myType>("myHeader"); 

Во всех примерах, которые я получаю следующее сообщение об ошибке:

The type or namespace name 'myType' could not be found (are you missing a using directive or an assembly reference?)

причин, почему я не могу использовать int прямо потому, что я загружаю типы из определенных сборок во время выполнения, поэтому они не будут «в t "в любое время.

+0

Вы можете сделать функцию родовым и просто сделать 'нового MyCLASS ("MYHEADER");'? –

+0

Спасибо, Quantic, это мне тоже помогло. – m506

ответ

0

Для создания generic списков во время выполнения, вы have-to use Reflection.

int myInt = 0; 
Type myType = myInt.GetType(); 

// make a type of generic list, with the type in myType variable 
Type listType = typeof(List<>).MakeGenericType(myType); 

// init a new generic list 
IList list = (IList) Activator.CreateInstance(listType); 

Update 1:

int myInt = 0; 
Type myType = myInt.GetType(); 
Type genericClass = typeof(MyClass<>); 
Type constructedClass = genericClass.MakeGenericType(myType); 
String MyParameter = "value"; 
dynamic MyInstance = Activator.CreateInstance(constructedClass, MyParameter); 
+0

Спасибо Али, в качестве дополнения, под полным кодом: int myInt = 0; Тип myType = myInt.GetType(); Тип genericClass = typeof (MyClass <>); Тип builtClass = genericClass.MakeGenericType (myType); String MyParameter = "value"; динамический MyInstance = Activator.CreateInstance (builtClass, MyParameter); С уважением – m506

+0

@ m506 Добро пожаловать. Не забудьте принять ответ, если это то, что вы искали. Я обновил сообщение и разместил там свой код. –

Смежные вопросы