ICollection бросил проблему - PullRequest
0 голосов
/ 03 июля 2010

Есть ли решение для решения проблемы с этим примером приведения?Мне нужно добавить новый элемент в коллекцию, поэтому я должен решить его.

    IEnumerable enumerable;
    IEnumerable enumerable2;
    enumerable = new ObservableCollection<Something>();
    enumerable2 = new ObservableCollection<Object>();


    ICollection<Object> try = (ICollection<Object>)enumerable;      //Don’t work
    ICollection<Object> try2 = (ICollection<Object>)enumerable2;    //Work

Ответы [ 8 ]

2 голосов
/ 03 июля 2010

Проверьте ковариацию и контравариантность с помощью общих параметров в C # 4. Это может дать вам больше информации на будущее, когда столкнетесь с такими проблемами.

0 голосов
/ 05 июля 2010

Динамическая типизация работает (только одна плохая вещь - мне нужно связать dll windows.csharp и system.core размером ~ 1 МБ, так что это не самое лучшее приложение для silverlight, но это лучшее решение, которое я знаюТеперь.)

0 голосов
/ 04 июля 2010

Если у вас есть контроль над соответствующим кодом, возможно, пришло время немного переосмыслить дизайн.Часто пытаются использовать максимально ограниченный интерфейс, который может достичь желаемого результата.В этом случае кажется, что IEnumerable не может достичь этого результата, если вы хотите добавить новые элементы.Переключение на более подходящий тип может быть лучшим решением, чем приведение коллекции.

0 голосов
/ 04 июля 2010

Используйте расширение Cast в сочетании с ToList.

IEnumerable ie1 = new ObservableCollection<string>();
ICollection<object> ic1 = (ICollection<object>)ie1.Cast<object>().ToList();

Или выполнить итерацию вручную.

0 голосов
/ 03 июля 2010

Вы можете перебирать коллекцию что-то и вставлять элементы в объект.

0 голосов
/ 03 июля 2010

Я не уверен на 100%, что вы это имеете в виду, но вы пробовали это:

IEnumerable<Object> try3 = enumerable.Cast<Object>();

Хорошо, это не сработало, как насчет динамического набора:

dynamic var = new Something();
dynamic try1 = enumerable;      
try1.Add(var);
0 голосов
/ 03 июля 2010

«try» - зарезервированное слово в C #. Вы пробовали другое имя переменной? или вы можете использовать @try, если вам нужно использовать имя переменной try.

0 голосов
/ 03 июля 2010

Если все, что вы знаете, это object, то неуниверсальные интерфейсы - ваш друг:

IList list = (IList)foo;
list.Add(yourItem);

Тем не менее! Не все перечисляемые элементы являются списками, поэтому не все могут быть добавлены таким образом. IList подкрепляет большую привязку данных, так что хорошая ставка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...