我有一种情况,我有一个类似于这样的数据容器:
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。
我的问题分为两部分:
我知道我可能会滥用“动态”试图获得我想要的行为,但有人可以解释为什么上述行为不起作用吗?
解决这种情况的最佳方法是什么?我应该将动态推入DataContainer的'GetData'并对其进行反泛化吗?
非常感谢!
答案 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的泛型类型