Есть ли хороший способ автоматически обрабатывать преобразования между массивами и строго типизированными коллекциями? - PullRequest
2 голосов
/ 17 апреля 2009

Справочная информация:

У меня есть большое решение, где сотни функций принимают строго типизированные коллекции в качестве параметров и используют их в качестве возвращаемых значений.

Решение ссылается на сгенерированный прокси, который преобразует вызовы в веб-сервис, который всегда возвращает коллекцию в формате int [] или Order [] или в любом другом виде. Прокси упаковывает их в IntCollection или OrderCollection.

Теперь я хочу обратиться к сборке напрямую. Когда я делаю это, я получаю интерфейс с массивами вместо сгенерированных строго прокси коллекций. Это, конечно, нарушает весь код.

Я ищу умный способ справиться с этим и избежать перезаписи тысяч строк кода.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2009

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> и т. Д.) Помогают, но интерфейсы не всегда хорошо работают в веб-сервисах. В зависимости от того, что код делает в настоящее время, вы можете исправить «заменить все», хотя и немного радикально; кроме этого ... вам придется изменить нечетные биты кода.

несколько мыслей:

  • переключение на var (в C # 3.0) может минимизировать это изменение, т.е. var orders = svc.GetOrders(); в большинстве случаев различные реализации будут иметь «достаточно похожие» API
    • resharper может помочь с этим
  • использование LINQ (.ToList(), .ToArray()) может служить прокладкой
0 голосов
/ 17 апреля 2009

Создать строго типизированную коллекцию из массива. Например, вы можете создать общий список из массива.

int[] oIntArray;
List<int> = new List<int>(oIntArray);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...