返回IEnumerable<;IMyInterface>;从列表<;我的界面类>;

本文关键字:gt lt 我的 界面 列表 IMyInterface IEnumerable 返回 | 更新日期: 2023-09-27 18:19:33

EDIT:这个问题在.NET4中是无效的,因为它实际上可以按需工作。

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

public interface IData
{
   IEnumberable<IOther> OtherList { get; }
   IOther AddOther();
   void RemoveOtherData(IOther 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.
}

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

返回IEnumerable<;IMyInterface>;从列表<;我的界面类>;

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

在.net 4上,IEnumerable<out T>是共变体。即实现CCD_ 2的类也自动实现IEnumerable<IOther>。所以也可以简单地写:

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

但我会避免这样做,因为它打破了封装,允许外部人员修改您的列表。

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

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

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

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
}

由于IEnumerable是协变的,这很好:

    public interface IInterface{}
    public class ClassA : IInterface{}
    public class ClassB
    {
        private readonly List<ClassA> _classAs;
        public IEnumerable<IInterface> Data{ get { return _classAs; } }
    }