C#:创建通用容器列表?

时间:2013-11-08 05:10:46

标签: c# generics dynamic

我有一种情况,我有一个类似于这样的数据容器:

public class DataContainer<T> 
{
    public T GetData { get; private set; }

    public DataContainer(T data)
    {
        this.GetData = data;
    } 
}

但不幸的是,我需要有一个这些容器的列表,其中每个容器的泛型参数在运行时才知道,并且可能因元素而异。我最初尝试使用类似的东西:

IList<DataContainer<dynamic>> containerList = new List<DataContainer<dynamic>>();
containerList.add((dynamic)new DataContainer<int>(4));
containerList.add((dynamic)new DataContainer<string>("test"));

遗憾的是,它不起作用(遇到RuntimeBinderException)。我最初尝试转换为(DataContainer),但我在那里得到了一个InvalidCastException。

我的问题分为两部分:

  1. 我知道我可能会滥用“动态”试图获得我想要的行为,但有人可以解释为什么上述行为不起作用吗?

  2. 解决这种情况的最佳方法是什么?我应该将动态推入DataContainer的'GetData'并对其进行反泛化吗?

  3. 非常感谢!

2 个答案:

答案 0 :(得分:3)

您可以这样做:

public interface IDataContainer
{
    object GetData{get;set;}
}

public class DataContainer<T> : IDataContainer
{
    public T GetData { get; private set; }

    object IDataContainer.GetData 
    {
        get { return this.GetData; }
        set { this.GetData = (T)value; }
    }

    public DataContainer(T data)
    {
        this.GetData = data;
    }
}

然后你可以这样做:

IList<IDataContainer> containerList = new List<IDataContainer>();

containerList.Add(new DataContainer<string>("test"));
containerList.Add(new DataContainer<int>(234));

答案 1 :(得分:0)

您可以创建DataContainer的非通用基类版本,并将其用于List的泛型类型