[C#] C #-하나의 목록에 여러 제네릭 형식

이것은 아마도 불가능하지만이 수업이 있습니다.

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

더 많은 것이 있지만 간단하게 유지합시다. 일반 유형 (DataType)은 where 문에 의해 값 유형으로 제한됩니다. 내가하고 싶은 것은 다양한 유형 (DataType)의 메타 데이터 개체 목록입니다. 같은 :

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

이것도 가능합니까?



답변

public abstract class Metadata
{
}

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


답변

leppie의 답변에 따라 MetaData인터페이스를 만드십시오 .

public interface IMetaData { }

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


답변

또한 new키워드를 사용하여 제네릭이 아닌 버전을 사용했습니다 .

public interface IMetadata
{
    Type DataType { get; }

    object Data { get; }
}

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

명시 적 인터페이스 구현은 두 Data멤버 모두를 허용하는 데 사용됩니다 .

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

버전 타겟팅 값 유형을 도출 할 수 있습니다.

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

이것은 모든 종류의 일반적인 제약으로 확장 될 수 있습니다.


답변