Формат для передачи коллекции в метод - PullRequest
1 голос
/ 29 мая 2009

Я использую API, метод которого требует аргумент такого типа:

System.Collections.ObjectModel.Collection<GenericTickType> genericTickList

Как мне создать объект для этого аргумента? Вот что я пробовал, но он продолжает говорить, что у вызова метода есть несколько недопустимых аргументов.

List<TickType> ticks_to_get = new List<TickType> { TickType.Price };

Я пытался создать экземпляр коллекции напрямую, а не списка, и, похоже, это не сработало.

Ответы [ 4 ]

2 голосов
/ 29 мая 2009

«Я пытался создать экземпляр коллекции напрямую, а не списка, и, похоже, это не сработало».

Какую ошибку вы получаете? Вы можете определенно создать экземпляр Collection<T> напрямую, это не абстрактный класс, и у него есть несколько открытых конструкторов, в том числе один без параметров. Вы можете сделать это, например:

var values = new System.Collections.ObjectModel.Collection<int> { 1,2,3,4 };

Я заметил, что ваш пример кода имеет GenericTickType и TickType. Это ошибка или у вас два занятия? Вы сказали, что это перечисление (которое?), Поэтому одно не может быть производным от другого. Если это два перечислимых типа, Collection<GenericTickType> и Collection<TickType> - это два разных класса, и один не может быть назначен другому.

Теперь, если TickType - это с возможностью преобразования в GenericTickType (и, вероятно, если они оба являются перечислениями и предполагают, что они имеют одинаковые числовые значения), вы все равно не можете привести Collection<TickType> Collection<GenericTickType>. Для большинства классов пока нет контра / ко-дисперсии (в C # 4). Но вы можете разыграть каждый TickType, выполнив что-то вроде этого:

List<GenericTickType> list = new List<GenericTickType> { (GenericTickType)TickType.Price };
list.Add((GenericTickType)TickType.Price); // add more...
Collection<GenericTickType>genericTicks = new Collection<GenericTickType>(list);

Если у вас уже есть List<TickType> и у вас есть доступ к C # 3.0 и LINQ, вы можете сделать это:

List<TickType> ticks = new List<TickType> { TickType.Price };
list.Add(TickType.Price); // add more...
List<GenericTickType> castedList = ticks.Cast<GenericTickType>().ToList();
Collection<GenericTickType>genericTicks = new Collection<GenericTickType>(castedList);

При этом используются методы расширения LINQ Cast<T>() и ToList<T>() для приведения каждого TickType в исходном списке к GenericTickType и создания нового List<GenericTickType>, который используется для создания экземпляра Collecion<GenericTickType>. (Я избегал использования var, чтобы вы могли видеть типы на каждом шаге).

1 голос
/ 29 мая 2009

Какой тип GenericTickType? Это перечисление или класс? Я предполагаю enum. Если это так, измените ваш код следующим образом:

Collection<GenericTickType> ticks_to_get = new Collection<GenericTickType>() { GenericTickType.Price };

Выше работает на 3.5 рамки.

1 голос
/ 29 мая 2009

Вы не можете передать List<> как Collection<>

Может быть, у вас есть проблемы с ковариацией / контравариантностью? Вы должны выполнить каст самостоятельно:

List<TickType> ticks_to_get = new Collection<TickType> { TickType.Price };

genericTickList = (Collection<GenericTickType>) ticks_to_get;

Посмотрите на ответ Дэйва Баумана ... если TickType.Price не возвращает объект типа TickType, он не будет работать

РЕДАКТИРОВАТЬ: Поскольку GenericTickType является перечислением - какой API вы используете? Это из вашей компании - вы можете изменить это? Кажется странным, что вас просят передать коллекцию значений enum. Посмотрите, можете ли вы изменить перечисление на помеченное перечисление ... и затем передать требуемые значения, объединив их с оператором or.

0 голосов
/ 29 мая 2009

Вы не можете использовать {} для инициализации Коллекции. Вы можете сделать что-то вроде этого, однако:

List<TickType> ticks_to_get = 
    new List<TickType>( new TickType[] { TickType.Price });

или

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