返回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.
}
在这种情况下,最好的解决方案是什么?
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; } }
}