从List <myinterfaceclass> </myinterfaceclass> </imyinterface>返回IEnumerable <imyinterface>

时间:2012-01-06 14:40:39

标签: c# interface

编辑:这个问题在.NET 4中无效,因为它实际上可以正常工作。

我有一个Data类,必须实现这样的接口:

public interface IData
{
   IEnumberable<IOther> OtherList { get; }
   IOther AddOther();
   void RemoveOtherData(IOther data);
}

但我仍然坚持在Data

中声明实际成员
public class Data : IData
{
   // desired, always return the same reference
   public IEnumberable<IOther> OtherList { get { return _mOtherList } }
   // Non persistent reference not desirable.
   public IEnumerable<IOther> OtherList { get { return _mOtherList.Select(x => x as IOther); } }        
   List<IOther> _mOtherList = new List<Other>(); // error, type mismatch
   List<Other> _mOtherList = new List<Other>(); // error, property return type mismatch
   IEnumerable<IOther> _mOtherList = new List<Other>(); // ok, but cannot use List methods without casting.
}

在这种情况下,最佳解决方案是什么?

3 个答案:

答案 0 :(得分:2)

public class Data : IData
{
   public IEnumerable<IOther> OtherList { get; private set; }        
   List<Other> _mOtherList = new List<Other>();

   public Data()
   {
     OtherList=mOtherList.Cast<IOther>();
   }
}

On .net 4 IEnumerable<out T>是共变体。即实现IEnumerable<Other>的类也会自动实现IEnumerable<IOther>。所以也可以简单地写一下:

public class Data : IData
{
   public IEnumerable<IOther> OtherList { get{return mOtherList;} }        
   List<Other> _mOtherList = new List<Other>();
}

但是我会避免这种情况,因为它打破了封装并允许外人修改你的列表。

((List<Other>)MyData.OtherList).Add(...);

答案 1 :(得分:1)

其他类必须实现IOther接口,您不需要强制转换。

当你声明_mOtherList时,它是IEnumerable,所以你不能使用list方法。将其声明为列表。

public class Data : IData
{
   List<IOther> _mOtherList = new List<Other>();

   public IEnumberable<IOther> OtherList { get { return _mOtherList } }

   IOther AddOther()
   {
       return null;
   }
   void RemoveOtherData(IOther data){}
}

你的其他课程:

class Other : IOther
{
   //some members
}

答案 2 :(得分:0)

由于IEnumerable是协变的,所以很好:

    public interface IInterface{}

    public class ClassA : IInterface{}

    public class ClassB
    {
        private readonly List<ClassA> _classAs;

        public IEnumerable<IInterface> Data{ get { return _classAs; } }
    }