1

我有一个看起来像这样的数据容器的情况:

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”中并对其进行反泛化吗?

非常感谢!

4

2 回答 2

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));
于 2013-11-08T09:00:28.597 回答
0

您可以制作 DataContainer 的非泛型基类版本并将其用于 List 的泛型类型

于 2013-11-08T08:29:19.267 回答