将CustomList <customclass>转换为IList <interface> </interface> </customclass>

时间:2010-07-13 18:25:57

标签: c#-3.0

(这是.Net 3.5)我有一个实现IList的类FooList和一个实现IFoo的类FooClass。用户需要IList<IFoo>。在我的实现中,我创建了一个名为X的FooList<FooClass>。如何对我的回复进行编码,以便我的FooList<FooClass> X成为他的IList<IFoo>

如果我尝试

返回X.Cast()。ToList();

他得到IList<IFoo>,但它不是我的FooList;它是一个List,也是一个新的。

1 个答案:

答案 0 :(得分:1)

这不会有效,因为FooList<FooClass>不是IList<IFoo>。这就是原因:

var myList = new FooList<FooClass>();
IFoo obj = new SomeOtherFooClass();
IList<IFoo> result = (IList<IFoo>)myList; // hypothetical, wouldn't actually work
result.Add(obj); // uh-oh, now myList has SomeOtherFooClass

您需要制作副本或使用对所包含类型实际协变的接口,例如IEnumerable<T>而不是IList<T>。或者,如果合适,您应该从一开始就将FooList<FooClass>声明为FooList<IFoo>

这是一个小实现,演示了我的第二个建议:

public interface IFoo { }
public class FooClass : IFoo { }

public class FooList<T> : IList<T>
{
    public void RemoveAt(int index) { /* ... */ }
    /* further boring implementation of IList<T> goes here */
}

public static void ListConsumer(IList<IFoo> foos)
{
    foos.RemoveAt(0); // or whatever
}

public static IList<IFoo> ListProducer()
{
    // FooList<FooClass> foos = new FooList<FooClass>(); // would not work
    FooList<IFoo> foos = new FooList<IFoo>();

    foos.Add(new FooClass());

    return foos; // a FooList<IFoo> is an IList<IFoo> so this is cool
}

public static void Demo()
{
    ListConsumer(ListProducer()); // no problemo
}