是否有一种很好的方法可以自动处理数组和强类型集合之间的转换?

时间:2009-04-17 09:24:33

标签: c# collections

背景:

我有一个很大的解决方案,其中数百个函数将强类型集合作为参数集并将它们用作返回值。

该解决方案引用生成的代理,该代理将调用转换为始终以int []或Order []或wathever类型的格式返回集合的Web服务。代理将它们包装为IntCollection或OrderCollection。

现在我想直接引用程序集。当我这样做时,我得到了针对数组的接口而不是代理生成的强类型集合。这当然会破坏所有代码。

我正在寻找一种智能的方法来处理这个并避免重写数千行代码。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

IntCollection等属于你吗?您可以添加隐式转换运算符:

class IntCollection : Collection<int> {
    public IntCollection() : base() { }
    public IntCollection(IList<int> data) : base(data) { }
    public static implicit operator int[](IntCollection items) {
        return items.ToArray(); // LINQ, but can do manually
    }
    public static implicit operator IntCollection (int[] items){
         return new IntCollection(items);
    }
}

通常,这将是接口(IList<Foo>等)帮助的时间之一 - 但接口在Web服务中通常不能很好地工作。根据代码当前的功能,您可能可以执行“替换所有”修复 - 但有点激烈;除此之外......你将不得不改变奇数位的代码。

一些想法:

  • 切换到var(在C#3.0中)可以最小化更改 - 即var orders = svc.GetOrders();在大多数情况下,不同的实现将具有“足够相似”的API
    • resharper可以帮助解决这个问题
  • 使用LINQ(.ToList().ToArray())可以作为垫片

答案 1 :(得分:0)

从数组中创建强类型集合。例如,您可以从数组创建通用列表。

int[] oIntArray;
List<int> = new List<int>(oIntArray);