【问题标题】:Is there a good way to handle conversions between arrays and strongly typed collections automatically?有没有一种自动处理数组和强类型集合之间转换的好方法?
【发布时间】:2009-04-17 09:24:32
【问题描述】:

背景:

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

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

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

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

有什么想法吗?

【问题讨论】:

    标签: c# collections


    【解决方案1】:

    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);
        }
    }
    

    通常,这将是接口(@98​​7654323@ 等)提供帮助的时候之一 - 但接口在 Web 服务中通常不能很好地工作。根据代码当前的功能,您可能可以进行“全部替换”修复 - 不过有点激烈;除此之外...您将不得不更改奇数位的代码。

    一些想法:

    • 切换到var(在C# 3.0 中)可能会最小化更改 - 即var orders = svc.GetOrders();在大多数情况下,不同的实现会有“足够相似”的 API
      • resharper 或许可以提供帮助
    • 使用 LINQ(.ToList().ToArray())可能会充当填充程序

    【讨论】:

    • @Marc - 我以前从未见过隐式运算符,在我的某些代码中会很有用。如果他的集合基于通用列表,那么他可以使用非 linq ToArray。
    • ToArray 在没有 LINQ 的泛型集合上可用
    • @ck - 并非所有人都这样做,例如字典。
    • @ck - 它在List&lt;T&gt; 上可用,但在Collection&lt;T&gt; 等上不可用。
    • @Stevo3000 - 确定你有:int i = 5;十进制 d = i;
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多