X.Single ((c) => c is [type]) не работает - PullRequest
0 голосов
/ 29 июля 2011

У меня есть коллекция List (Component - это пользовательский класс) с единственным элементом , который наследуется от XTYPE.

Но по какой-то причине это не работает:

X = (XTYPE)Components.Single((c) => c is XTYPE);

Я получаю исключение InvalidOperationException с сообщением «Последовательность не содержит соответствующий элемент», но если я добавлю точку останова в эту строку и сделаю это, она вернет true:

Components[0] is XTYPE

Кроме того, если я сделаю это, он вернет true:

Components[0].GetType().BaseType.BaseType == typeof(XTYPE)

Help.


OK , поэтому я добавил несколько проверок в свой код...

        foreach (Component c in Components)
            Console.WriteLine(c.GetType().BaseType.BaseType == typeof(Bridge));
        if (Components.Count == 0)
            throw new Exception("No components");
        if (!(Components[0].GetType().BaseType.BaseType == typeof(Bridge)))
            throw new Exception("Not bridge.");

False записывается в консоль, но имена типов совпадают.Это, вероятно, DLL ад.И теперь требуется разный набор информации, чтобы ответить на вопрос.

Я думаю, что вы, ребята, помогли мне перейти к моему решению.


Дальнейшее объяснение: конкретный компонент был создан с помощьюотражение от отдельного экземпляра библиотеки DLL, в которой есть XTYPE.Итак, теперь у нас есть два XTYPE, но технически они не совпадают с типом, потому что у них есть дескриптор различий.

Отладчик не проверял в правильном контексте, поэтому он думал, что типы были одинаковыми,Но это было неправильно.

Ответы [ 2 ]

1 голос
/ 29 июля 2011

Компонент, о котором идет речь, был создан с помощью отражения от отдельного экземпляра библиотеки DLL, в которой есть XTYPE. Итак, теперь у нас есть два XTYPE, но технически они не одного типа, потому что у них есть ручка типа diff.

Отладчик не проверял в правильном контексте, поэтому думал, что типы одинаковы. Но это было неправильно.

1 голос
/ 29 июля 2011

Single бросает, если условие выполняется более чем одним элементом.Если вы хотите, чтобы только один из них использовал First.Но поскольку в вашем обновлении говорится, что ошибка «Последовательность не содержит совпадающих элементов», First вам не поможет.

Вы можете использовать OfType.Это не поможет с вашей проблемой, но делает код немного приятнее.И помешает вам случайно использовать другой тип в актерском составе, чем в чеке.

XTYPE x=Components.OfType<XTYPE>().Single();

Некоторые другие возможные причины:

  • вы используете другой Components внемедленный режим.Таким образом, коллекция, над которой работает код, пуста, та, на которую вы ссылаетесь в непосредственном режиме, содержит элемент
  • Реализация коллекции нарушена, то есть индексатор и перечислитель несовместимы.Но поскольку вы, вероятно, говорите о реализации Components из самой платформы, это маловероятно.
  • Тип, к которому вы применяете, отличается от того, который вы проверяете
  • Youсделал несколько незаконных многопоточности и повредил состояние
...