C # Создание объектов с помощью Generics во время выполнения - PullRequest
0 голосов
/ 30 мая 2009

В следующем примере я могу динамически создать объект через строку; Тем не менее, я не могу добраться до открытых методов класса BASE. я не могу привести obj к BASE, потому что я не знаю, какой дженерик будет использоваться во время разработки. любые предложения по выполнению во время выполнения были бы хорошими.

Проект A содержит класс A {T, J>: BASE {T, J>
Проект B содержит класс B {T, J>: BASE {T, J>

Проект C содержит класс BASE {T, J>
публичный виртуальный контроль {T, J> item

Форма Windows Project
Событие cmdGo_Click

string dll = textbox1.text // ex "ProjectA.dll"
string class = textbox2.text // ex "A`2 [enuT, enuJ]"
объект obj = activator.createinstancefrom (dll, класс)

Ответы [ 3 ]

5 голосов
/ 30 мая 2009

Этот код создает экземпляр BASE :

Type type = typeof(BASE<,>).MakeGenericType(typeof(int), typeof(string));
object instance = Activator.CreateInstance(type);
1 голос
/ 30 мая 2009

Если вы не знаете параметров типа, используемых во время выполнения, то вы также не можете использовать какие-либо операции, которые зависят от этих типов, так что ... почему бы не сделать базовый класс неуниверсального типа BASE, который содержит операции, которые не зависят от общих параметров, тогда вы можете указать obj для этого базового типа и использовать его.

0 голосов
/ 30 мая 2009

В время выполнения обобщенная часть уравнения не имеет значения, потому что компилятор уже заполнил пробелы для универсальной реализации. Я полагаю, что вы можете использовать рефлексию, чтобы получить методы базового класса, как в следующем примере, надеюсь, это поможет.

MethodInfo[] baseMethods = obj.GetType().BaseType.GetMethods();
object retObj = baseMethods[0].Invoke(obj, new object[] {"paramVal1", 3, "paramVal3"});
...