1

好的,我一直在尝试找到执行只读通用集合接口的最佳方法,这就是我想出的:

public delegate Boolean EnumerateItemsDelegate<ItemType>(ItemType item);
public delegate Boolean EnumerateItemsDelegate(Object item);

public interface IReadOnlyObjectCollection<out ItemType>
{
    Boolean ContainsItem(Object item);
    Array CopyToArray();
    void EnumerateItems(EnumerateItemsDelegate enumerateItemsDelegate);

    UInt32 Count { get; }
    UInt32 Capacity { get; }
}

public interface IReadOnlyCollection<ItemType> : IReadOnlyObjectCollection<ItemType>
{
    Boolean ContainsItem(ItemType item);
    Array<ItemType> CopyToArray();
    void EnumerateItems(EnumerateItemsDelegate<ItemType> enumerateItemsDelegate);

    UInt32 Count { get; }
    UInt32 Capacity { get; }
}

这是为了回避 Microsoft 集合接口的大问题......无法将派生的只读集合分配给基本集合。

IReadOnlyObjectCollection<String> s;
IReadOnlyObjectCollection<Object> o = s;

显然,这些接口并不理想,因为您仍然必须使用“对象”而不是实际类型,但我认为这在没有仅编译时泛型的情况下尽可能接近。如果你们看到任何巨大的问题或缺点,我将不胜感激......

4

0 回答 0