C # - tek bir listede birden çok genel türler

oy
110

Bu muhtemelen mümkün değildir, ancak bu sınıf var:

public class Metadata<DataType> where DataType : struct
{
    private DataType mDataType;
}

Orada daha fazla, ama en basit tutalım. genel tür (VeriTürü) nerede deyimi ile değer türleri ile sınırlıdır. Ne yapmak istiyorum değişen türleri (VeriTürü) bu Meta veri nesnelerinin bir listesi var olduğunu. Gibi:

List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<int>());
metadataObjects.Add(new Metadata<bool>());
metadataObjects.Add(new Metadata<double>());

Bu mümkün olabilir mi?

Oluştur 09/12/2008 saat 16:29
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
142

public abstract class Metadata
{
}

// extend abstract Metadata class
public class Metadata<DataType> : Metadata where DataType : struct
{
    private DataType mDataType;
}
Cevap 09/12/2008 saat 16:31
kaynak kullanıcı

oy
72

Leppie cevabı takiben, neden yapamaz MetaDatabir arayüz:

public interface IMetaData { }

public class Metadata<DataType> : IMetaData where DataType : struct
{
    private DataType mDataType;
}
Cevap 09/12/2008 saat 16:41
kaynak kullanıcı

oy
25

Ben de kullanarak, bir genel olmayan versiyonunu kullandık newkeyword:

public interface IMetadata
{
    Type DataType { get; }

    object Data { get; }
}

public interface IMetadata<TData> : IMetadata
{
    new TData Data { get; }
}

Açık arabirim uygulaması hem sağlamak için kullanılır Dataüyeleri:

public class Metadata<TData> : IMetadata<TData>
{
    public Metadata(TData data)
    {
       Data = data;
    }

    public Type DataType
    {
        get { return typeof(TData); }
    }

    object IMetadata.Data
    {
        get { return Data; }
    }

    public TData Data { get; private set; }
}

Sen değer türlerini hedefleyen bir sürümünü elde edebileceğini:

public interface IValueTypeMetadata : IMetadata
{

}

public interface IValueTypeMetadata<TData> : IMetadata<TData>, IValueTypeMetadata where TData : struct
{

}

public class ValueTypeMetadata<TData> : Metadata<TData>, IValueTypeMetadata<TData> where TData : struct
{
    public ValueTypeMetadata(TData data) : base(data)
    {}
}

Bu genel kısıtlamaları her türlü uzatılabilir.

Cevap 09/12/2008 saat 17:14
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more