Czy da się jakoś przekonwertować Type jako argument na generyka

0

Cześć
mam zastanego enuma, który ma tako atrybut Type
poglądowo wygląda to tak

public enum Data
{
[Type(typeof(string))]
Data1,
[Type(typeof(customType))]
Data2
}

potem w kodzie jest tworzona lista w zalezoności od typu enuma i jest zwracana jako object

ogólnie zamotka i masakra

ja bym chciał aby jakoś zwrócić List<T> (zamiast object)
czyli mam typ jako member(gdzieś w klasie atrybutu) i potem mogę chciałbym taką magię uskutecznić, ale nie wiem czy takie coś jest możliwe

// jest to rzecz poglądowa - ja wiem, że Activator.CreateInstance zwraca obiekt - chodzi mi o takie przejscie z Argumentu do Generyka
// czy da się w ogóle takie coś zrobić - z argumentu do generyka?

public List<T> Return<T>(Type key)//gdzie T jest typu TYPE
{
 Type ListType= typeof(List<>).MakeGenericType(key);
 return Activator.CreateInstance(ListType);
}

0

A jaką semantykę na ten twój atrybut? Jak to niby jest, że enum jest typu string?

0

@AnyKtokolwiek: to jest stary kod, ktoś tak to wymyślił, ale ja chcę to poprawić (udekorować)
chodzi o to, że jak jest Enum.Data1 - to gdzies tam tworzy List<string> ale kurde zwraca obiekt, potem to gdzies jest castowane - no zamotka

zresztą nieważne

chodzi mi, czy z typu jako argument da się przejść na generyki?
bo mi się nie wydaje

2
mussel napisał(a):

chodzi mi, czy z typu jako argument da się przejść na generyki?
bo mi się nie wydaje

Nie da się. Albo wiesz w trakcie pisania na jakich typach operujesz i wtedy używasz generyków i typowania statycznego. Albo nie wiesz i musisz korzystać z refleksji i Type. To jest trochę tak, jakbyś chciał przewidzieć przyszłość. To znaczy: chciałbyś wiedzieć w trakcie pisania kodu co po kompilacji i uruchomieniu programu będzie w Type key. I to nie jest możliwe, tak jak niemożliwe jest przewidzenie przyszłości.

Edit: Co nie oznacza, że twojego refaktoringu nie da się zrobić. Po prostu nie tym sposobem.

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