C # - Mehrere generische Typen in einer Liste

stimmen
110

Dies ist wahrscheinlich nicht möglich, aber ich habe diese Klasse:

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

Es gibt mehr zu ihm, aber sie es einfach halten. Der generische Typ (Datentyp) ist auf Werttypen durch das in dem Statement. Was ich tun möchte, ist eine Liste dieser Metadaten Objekte unterschiedlicher Typen haben (Datentyp). Sowie:

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

Ist das überhaupt möglich?

Veröffentlicht am 09/12/2008 um 16:29
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
142

public abstract class Metadata
{
}

// extend abstract Metadata class
public class Metadata<DataType> : Metadata where DataType : struct
{
    private DataType mDataType;
}
Beantwortet am 09/12/2008 um 16:31
quelle vom benutzer

stimmen
72

Nach leppie Antwort, warum nicht MetaDataeine Schnittstelle:

public interface IMetaData { }

public class Metadata<DataType> : IMetaData where DataType : struct
{
    private DataType mDataType;
}
Beantwortet am 09/12/2008 um 16:41
quelle vom benutzer

stimmen
25

Ich habe auch eine nicht-generische Version, die mit newStichwort:

public interface IMetadata
{
    Type DataType { get; }

    object Data { get; }
}

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

Explizite Schnittstellenimplementierung verwendet , um beide zu ermöglichen , DataMitglieder:

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; }
}

Sie könnten eine Version Targeting Werttypen ableiten:

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)
    {}
}

Dies kann auf jede Art von generischen Einschränkungen erweitert werden.

Beantwortet am 09/12/2008 um 17:14
quelle vom benutzer

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