C # Создает объекты с помощью дженериков во время выполнения

StackOverflow https://stackoverflow.com/questions/928665

Вопрос

В следующем примере я могу создать объект динамически с помощью строки;однако у меня нет способа получить доступ к открытым методам БАЗОВОГО класса.я не могу привести obj к базе, потому что я не знаю, какой generic будет использоваться во время разработки.любые предложения по выполнению этого во время выполнения были бы приятными.

Проект A содержит класс A{T,J> :ОСНОВАНИЕ{T,J>
Проект B содержит класс B{T,J> :ОСНОВАНИЕ{T,J>

Проект C содержит БАЗОВЫЙ класс{T,J>
элемент публичного виртуального контроля {T, J>

Форма Окна проекта
Событие cmdGo_Click

строка dll = textbox1.text //пример "ProjectA.dll"
string class = textbox2.text //пример "A`2[enuT,enuJ]"
object obj = активатор.createinstancefrom(библиотека dll, класс)

Это было полезно?

Решение

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

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

Другие советы

Этот код создает экземпляр BASE<int, string=""> :

Type type = typeof(BASE<,>).MakeGenericType(typeof(int), typeof(string));
object instance = Activator.CreateInstance(type);

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top