2011-07-29 10 views
0

リストがあります<コンポーネント>コレクション(コンポーネントはカスタムクラスです)XTYPEから継承する単一の要素です。X.Single((c)=> cは[型])が機能しない

しかし、これは動作しません何らかの理由:

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

私はメッセージでInvalidOperationExceptionが取得「順序が一致する要素が含まれていません」 しかし、私はその行にブレークポイントに入れ、これにそれを行う場合戻りtrue:私はこれを行う場合

Components[0] is XTYPE 

は、さらにそれがtrueを返します。

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

ヘルプ。 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."); 

がコンソールに書き込まれます...私のコードにいくつかのチェックを追加しましたが、タイプ名は同じです。 これはおそらくDLLの地獄です。そして今、質問に答えるための情報の差集合が必要です。

私はあなたが私の解決策に向かう手助けをしてくれたと思います。


さらに説明:問題のコンポーネントがそれにXTYPEを有するDLLの別のインスタンスからの反射を介してインスタンス化されました。だから今は2つのXTYPEがありますが、彼らはdiff型のハンドルを持っているので、技術的には同じ型ではありません。

デバッガが正しいコンテキストでチェックしていないため、タイプが同じであると考えました。しかしそれは間違っていた。

+9

キャップロックキーが壊れているため動作しません。 – CodesInChaos

+2

「働いていない」の* kind *とは何ですか? – AakashM

+0

本当に面白い仲間。 –

答えて

1

いくつかの状態を破損し

  • をチェックしているものとは異なりますその中にXTYPEを持つDLLのインスタンスです。だから今は2つのXTYPEがありますが、彼らはdiff型のハンドルを持っているので、技術的には同じ型ではありません。

    デバッガが正しいコンテキストでチェックしていないため、タイプが同じであると考えました。しかしそれは間違っていた。

  • 1

    Singleは、複数の要素が条件を満たす場合にスローされます。それらのうちの1つだけにしたい場合はFirstを代わりに使用してください。しかし、あなたの更新は、エラーが "シーケンスに一致する要素が含まれていない"と述べているため、Firstはあなたを助けません。

    OfTypeをご検討ください。それはあなたの問題に役立つことはありませんが、コードは少し良くなります。また、キャスト内のチェックとは異なるタイプの誤った使用を防ぐことができます。

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

    他のいくつかの理由が考え:あなたは即時モードで異なるComponentsを使用している

    • 。したがって、コードが処理しているコレクションは空です。即時モードで参照しているコレクションには、要素が含まれています。
    • コレクションの実装が壊れています。つまり、インデクサーと列挙子は矛盾しています。しかしおそらくフレームワーク自体からのComponentsの実装については、おそらくそうは考えていないからです。
    • あなたにキャストしているタイプは、あなたがあなたには、いくつかの違法なマルチスレッドを行なったし、問題のコンポーネントを別々のからの反射を経由してインスタンス化された
    +0

    シーケンスにはXTYPEのコンポーネントが1つしかありません。実際にはシーケンス内に1つのコンポーネントしかありません。 –

    関連する問題