Bu muhtemelen mümkün değil, ama bu sınıf var:
public class Metadata<DataType> where DataType : struct
{
private DataType mDataType;
}
Daha fazlası var, ama basit tutalım. Genel tür (DataType) where deyimi tarafından değer türleriyle sınırlıdır. Ne yapmak istiyorum bu metadata nesnelerin değişen türleri (DataType) bir listesi var. Gibi:
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<int>());
metadataObjects.Add(new Metadata<bool>());
metadataObjects.Add(new Metadata<double>());
Bu mümkün mü?
Hem soyut temel sınıf hem de arabirim, listeye eklenebilecek öğelerin türünü kısıtlayarak bir derece kontrol sağlar. Boksun buna nasıl geldiğini de göremiyorum.
—
0b101010
Tabii ki, .NET v4.0 veya üstünü kullanıyorsanız, çözüm kovaryanstır.
—
0b101010
List<Metadata<object>>
hile yapar.
@ 0b101010, Her ikisi de yalnızca referans türlerini kısıtlar, herhangi bir yerleşik değer türü ve herhangi bir yapı hala eklenebilir. Ayrıca, sonunda,
—
Saeb Amini
MetaData
her bir öğenin temel değer türü hakkında (derleme zamanı) hiçbir bilgi içermeyen, orijinal değer türleriniz yerine referans türlerinin bir listesi vardır , bu da etkili bir şekilde "bokslama" dır.
List<object>
? Boks / kutudan çıkmayıMetadata
bırakmazlar , döküm ihtiyacını ortadan kaldırmazlar ve sonuçta size gerçek hakkında hiçbir şey söylemeyen bir nesne alıyorsunuzDataType
, bu sorunları çözmek için bir çözüm arıyordum. Eğer bir arabirim / sınıf ilan edecekseniz, sadece gerçekleme listesine gerçekleyen / türetilmiş jenerik türü koymak adına, anlamsız bir katmandan başka bir katman kullanmaktan ne kadar farklıdırList<object>
?