我有一个IList<DerivedClass>我想投的东西ICollection<BaseClass>但是当我尝试一个明确的演员时,我得到了null.是否可以在不创建和填充新集合的情况下执行此操作?
编辑: 由于我只想从集合中读取,我转而使用泛型方法:
public void PopulateList<BaseClass>(ICollection<T> collection)
Run Code Online (Sandbox Code Playgroud)
然后我可以通过它IList<DerivedClass>.有没有一种很好的方法来缓存此列表,以便我可以在需要时刷新它.我的第一个倾向是使用:
Object cachedCollection;
Type cachedType;
public void PopulateList<BaseClass>(ICollection<T> collection) {
cachedCollection = collection;
cachedType = T;
// other stuff...
}
private void Refresh() {
PopulateList<cachedType>(cachedCollection as ICollection<cachedType>);
}
Run Code Online (Sandbox Code Playgroud)
有没有人有更好的方法这样做?
假设我有一个期望基类型的泛型集合参数的方法,请参阅下面的Test.MethodA(IEnumerable(BaseClass)listA).为什么我传递代码不会构建的派生类型的集合?难道DerivedClass的所有实例都不是BaseClass吗?
我本来可以创建一个新的List(BaseClass)并将其传递给MethodA(IEnumerable(BaseClass)listA).但我认为C#足够聪明,知道DerivedClass的集合具有与BaseClass集合相同的所有属性.
使用List.Cast(T)()方法,因为我已经展示了解决此问题的最佳方法?
abstract class BaseClass
{
public int SomeField;
public abstract string SomeAbstractField
{
get;
}
}
class DerivedClass:BaseClass
{
public override string SomeAbstractField
{
get { return "foo"; }
}
}
class TestClass
{
public void MethodA(IEnumerable<BaseClass> listA)
{
}
public void MethodB()
{
List<DerivedClass> listB = new List<DerivedClass>();
//Error 16 The best overloaded method match for
//TestClass.MethodA(List<BaseClass>)'
//has some invalid arguments
this.MethodA(listB);
//this works
this.MethodA(listB.Cast<BaseClass>()); …Run Code Online (Sandbox Code Playgroud) 我有返回的代码和IVehicle接口的数组
IEnumerable<IVehicle> allVehicles = GetAllVehicles();
Run Code Online (Sandbox Code Playgroud)
我知道所有这些对象都是Car对象.什么是正确的投射方式
IEnumerable<IVehicle>
Run Code Online (Sandbox Code Playgroud)
至
IEnumerable<Car>
Run Code Online (Sandbox Code Playgroud)
因为我需要将这些传递给另一个需要的功能 <Enumerable<Car>