Podczas opracowywania jednego z moich projektów napotkałem problem dotyczący typów ogólnych.Inicjowanie tablicy ogólnych kolekcji o różnych argumentach ogólnych
Projekt wymaga napisania klasy, która działałaby jako źródło obiektów listy. Przypuśćmy, miałem następujące klasy:
public class TablesProvider
{
private readonly List[] _tables;
public TablesProvider()
{
// initialize the tables var here....
}
public List<TItem> GetTable<TItem>()
{
return (List<TItem>)_tables.Single(x => x is List<TItem>);
}
}
Klasa ta oczywiście nie działa, ponieważ typ List
to typ rodzajowy i dlatego generyczne argumenty powinny zostać określone.
Stworzyłem więc abstrakcyjny typ o nazwie MyList
, który zostałby wyprowadzony przez bardziej szczegółowy typ MyList<TItem>
w celu uniknięcia tego wymagania i nieco zmodyfikowałam TablesProvider
.
Działa to całkiem dobrze. Pozostał tylko jeden problem. Załóżmy, że mam 45 różnych kolekcji, z których każda jest zdefiniowana z innym ogólnym argumentem. Jaki byłby najlepszy sposób na zainicjowanie wszystkich tych kolekcji? Nie mogę korzystać z pętli for tutaj, ponieważ parametry generyczne są określone w czasie kompilacji, a nie w czasie wykonywania, a więc budowa takiego nie byłoby możliwe:
for (int i = 0; i < 45; i++)
_tables[i] = new MyList<GenericParameters[i]>();
Moim ostatecznym celem jest mieć luksus po prostu zrobić coś takiego ...
var table = _tablesProvider.GetTable<SomeClass>();
var element = table[3];
var propertyValue = element.SomeProperty;
... bez konieczności oddanych zmienną element
w celu uzyskania dostępu do swoich członków specyficzne dla danego typu.
Warto chyba wspomnieć, że ilość różnych obiektów listy jest ustalona na 45. To się nie zmieni. Teoretycznie mógłbym zainicjować linię tablicową po linii lub mieć zamiast niej 45 właściwości lub zmiennych. Obie te opcje brzmią jednak raczej jako tanie rozwiązanie, ale zaakceptuję jedną z nich, jeśli nie ma innej drogi.
Każdy z was ma jakieś pomysły? Czy robię to zupełnie źle? Czy powinienem wziąć pod uwagę inną strukturę?
Z góry dziękuję.
cały punkt polega na uniknięciu napisania 45 linii kodu. Nie sądzę, że tego właśnie szuka. – Tweety
@Tweety Być może, ale w jaki sposób wypełniłby swoją hipotetyczną tablicę "GenericParameters []" w pierwszej kolejności bez 45 linii _something_ (czy to kod, plik konfiguracyjny, itp.)? Jego stwierdzony projekt zawiera 45 linii czegoś gdzieś. Chodzi tylko o to, gdzie są i jak wyglądają. – JLRishe