To chyba nie jest możliwe, ale mam taką klasę:
public class Metadata<DataType> where DataType : struct
{
private DataType mDataType;
}
Jest w tym coś więcej, ale nie komplikujmy. Typ ogólny (DataType) jest ograniczony do typów wartości przez instrukcję where. To, co chcę zrobić, to mieć listę tych obiektów metadanych różnych typów (DataType). Jak na przykład:
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<int>());
metadataObjects.Add(new Metadata<bool>());
metadataObjects.Add(new Metadata<double>());
Czy to w ogóle możliwe?
List<object>
? Nie przestaną boksować / rozpakowywać, nie usuwają potrzeby odlewania, a ostatecznie otrzymujeszMetadata
obiekt, który nie mówi ci nic o faktycznymDataType
, szukałem rozwiązania tych problemów. Jeśli zamierzasz zadeklarować interfejs / klasę, tylko po to, aby móc umieścić implementujący / wyprowadzony typ ogólny na liście ogólnej, jak różni się to od używaniaList<object>
innej niż posiadanie bezsensownej warstwy?List<Metadata<object>>
Zrób sztuczkę.struct
ograniczenie, tutaj nie działa. ZobaczMetaData
typów referencyjnych zamiast oryginalnych typów wartości bez informacji (w czasie kompilacji) o bazowym typie wartości każdego elementu, co jest efektywnym „opakowaniem”.Odpowiedzi:
źródło
List<object>
? proszę spojrzeć na mój komentarz zamieszczony pod pytaniem OP.Idąc za odpowiedzią Leppiego, dlaczego nie stworzyć
MetaData
interfejsu:źródło
Użyłem również wersji innej niż generyczna, używając
new
słowa kluczowego:Jawna implementacja interfejsu jest używana, aby umożliwić obu
Data
członkom:Możesz uzyskać wersję kierowania na typy wartości:
Można to rozszerzyć na dowolny rodzaj ogólnych ograniczeń.
źródło
DataType
i bardzoobject Data
pomogłeś)Deserialize<metadata.DataType>(metadata.Data);
. Mówi mi, że nie można rozwiązać metadanych symboli . Jak pobrać DataType, aby użyć go do metody ogólnej?