Dynamiczny generyk

0

Powiedzmy że mam X modeli, w runtime dostaje stringa z którego mogę się dowiedzieć jaki to model i chciałbym odpytać zewnętrzne API, coś jak:

var type = typeof("string");
List<type> result = Client.Query<type>()

Czy da się coś takiego zrobić?
Albo jak się taką sytuacje obsłużyć?

Nie potrzebuje nic takiego zakodzić, po prostu się zastanawiam jak to powinno wyglądać.

0

No nie da się użyć podczas kompilacji typu, który znasz dopiero w runtime. Ale bez problemu można tworzyć sobie obiekty generyczne dynamicznie, np:

var typeName = "System.String";
var type = Type.GetType(typeName);
var listType = typeof(List<>);
var concreteListType = listType.MakeGenericType(type);
var list = Activator.CreateInstance(concreteListType);

To, co musisz zrobić w takiej sytuacji, to zmienić swoją metodę Query i zamiast parametru generycznego mieć zwykły parametr typu Type. No, a typem zwracanym, nie będzie też List<type>, ale już np. IList albo IEnumerable może być.

0

To w sytuacji gdy mogę zmienić Query. A gdy to jest jakaś zewnętrzna biblioteka?

1

Czyli nie chcesz tworzyć generycznego typu, a po prostu wywołać generyczną metodę:

var typeName = "System.String";
var type = Type.GetType(typeName);
var method = typeof(Client).GetMethod(nameof(Client.Query));
var concreteMethod = method.MakeGenericMethod(type);
var client = new Client();
var result = concreteMethod.Invoke(client, null);

1 użytkowników online, w tym zalogowanych: 0, gości: 1