相关疑难解决方法(0)

将泛型集合转换为基类型

我有一个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)

有没有人有更好的方法这样做?

.net generics collections

6
推荐指数
2
解决办法
8796
查看次数

将通用的对象集合传递给需要基类型集合的方法

假设我有一个期望基类型的泛型集合参数的方法,请参阅下面的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)

c# collections types casting

4
推荐指数
1
解决办法
4426
查看次数

在C#中,将接口列表强制转换为对象列表的推荐方法是什么?

我有返回的代码和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>

c# collections casting

1
推荐指数
2
解决办法
57
查看次数

标签 统计

collections ×3

c# ×2

casting ×2

.net ×1

generics ×1

types ×1