C # - Vários tipos genéricos em uma lista

votos
110

Este é provavelmente não é possível, mas eu tenho essa classe:

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

Há mais do que isso, mas vamos mantê-lo simples. O tipo genérico (DataType) está limitado a tipos de valor pelo qual comunicado. O que eu quero fazer é ter uma lista desses objetos de metadados de diferentes tipos (DataType). Tal como:

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

Isto é mesmo possível?

Publicado 09/12/2008 em 16:29
fonte usuário
Em outras línguas...                            


3 respostas

votos
142

public abstract class Metadata
{
}

// extend abstract Metadata class
public class Metadata<DataType> : Metadata where DataType : struct
{
    private DataType mDataType;
}
Respondeu 09/12/2008 em 16:31
fonte usuário

votos
72

Após a resposta de leppie, porque não fazer MetaDatauma interface:

public interface IMetaData { }

public class Metadata<DataType> : IMetaData where DataType : struct
{
    private DataType mDataType;
}
Respondeu 09/12/2008 em 16:41
fonte usuário

votos
25

Eu usei também uma versão não-genérico, usando a newpalavra-chave:

public interface IMetadata
{
    Type DataType { get; }

    object Data { get; }
}

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

Implementação explícita interface é usada para permitir que ambos os Datamembros:

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

Você pode derivar uma versão alvo tipos de valores:

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

Isso pode ser estendido a qualquer tipo de restrições genéricas.

Respondeu 09/12/2008 em 17:14
fonte usuário

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