djd*_*d87 0 c# generics casting list .net-2.0
我有一个DataSource在我的控制这始终是一个List<T>地方T有继承IEntity.
public class MyClass<T> where T : IEntity
{
public List<T> DataSource
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,显然你不能去做一个以下List<T>的List<IEntity>事情:
List<IEntity> wontWork = (List<IEntity>)this.DataSource;
Run Code Online (Sandbox Code Playgroud)
如何将DataSource作为List的列表IEntity,同时仍然可以添加和删除项目DataSource?即我可以执行以下操作,但从List中删除它不会从DataSource中删除:
public List<TOut> GetDataSourceCopyAsUnderlyingType<TOut>()
{
if (this.DataSource == null)
{
return new List<TOut>();
}
else
{
// Get the list and the enumerator
IList list = (IList)this.DataSource;
IEnumerator enumerator = list.GetEnumerator();
// Build the target list
List<TOut> targetList = new List<TOut>();
int i = 0;
while (enumerator.MoveNext())
{
TOut entity = (TOut)list[i];
targetList.Add(entity);
i++;
}
return targetList;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我需要一些方法来做以下事情:
List<IEntity> interfaceList = this.GetDataSourceAsAnotherType<IEntity>();
int dataSourceCount = this.DataSource.Count; // Equals 5
int interfaceCount = interfaceList.Count; // Equals 5
interfaceList.RemoveAt(0);
int dataSourceCount = this.DataSource.Count; // Equals 4
int interfaceCount = interfaceList.Count; // Equals 4
Run Code Online (Sandbox Code Playgroud)
只是添加,我不介意是否意味着我必须使用不同的类型而不是List.
编辑:对不起,忘了说我使用的是.Net2.0,无法移动到.Net 3.5.
如果允许的话,这将是一个非常糟糕的主意,这就是为什么它不是.我可以添加任何旧的IEntity,List<IEntity>如果IEntity不能转换为T,它会爆炸.虽然所有的Ts都是IEntities,但并非所有的IEntities都是Ts.
这适用于数组,因为数组有一个故意的子类型(就像在Java中一样).集合没有子类型.