2011-07-29 28 views
0

我有一個列表<組件>集合(組件是一個自定義類)與單個元素從XTYPE繼承。X.Single((c)=> c是[type])不起作用

但出於某種原因,這並不工作:

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的單獨實例實例化。所以現在我們有兩個XTYPE,但是它們在技術上並不是相同的類型,因爲它們有一個diff類型的句柄。

調試器沒有在正確的上下文中檢查,所以它認爲類型是相同的。但這是錯誤的。

+9

它不工作,因爲你的大寫鎖定鍵已損壞。 – CodesInChaos

+2

什麼*種類的「不起作用」? – AakashM

+0

真正有趣的兄弟。 –

回答

1

問題組件是通過反射實例從一個單獨的一個不同具有XTYPE的DLL實例。所以現在我們有兩個XTYPE,但是它們在技術上並不是相同的類型,因爲它們有一個diff類型的句柄。

調試器沒有在正確的上下文中檢查,所以它認爲類型是相同的。但這是錯誤的。

1

Single如果多個元素滿足條件,則拋出。如果您只希望其中一個使用First代替。但由於您的更新指出錯誤是「序列不包含匹配元素」,First不會對您有所幫助。你可以考慮使用OfType。這對你的問題沒有幫助,但是使代碼更好一些。並且防止你在演員中意外地使用不同的類型而不是在支票中。

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

其他一些可能的原因:你在即時模式下使用不同的Components

  • 。因此代碼正在處理的集合是空的,您在即時模式下引用的集合包含元素
  • 集合實現已損壞,即索引器和枚舉器不一致。但是因爲你可能正在談論框架本身的Components實現,這是不太可能的。
  • 你鑄造的類型是將從正在檢查
  • 你做一些非法的多線程和破壞了一些狀態
+0

序列中只有一個XTYPE組件。序列中實際上只有一個組件。 –