2010-03-30 35 views
2

嗯,.NET類型轉換問題:簡單但困難

這個問題有點簡單。

我有一個對象定義爲:

public class FullListObject : System.Collections.ArrayList, IPagedCollection 

,當我嘗試到:

IPagedCollection pagedCollection = (IPagedCollection)value; 

它不工作...值是FullListObject ......這是我的新代碼試圖解決「is」運算符的問題。當系統測試(value is IPagedCollection)時,FullListObject永遠不會變爲true。

如何將對象轉換爲具有接口類型的另一個對象?

編輯:

只是爲了記錄:開溜代碼

if (value is IPagedCollection) 
{ 
    IPagedCollection pagedCollection = value as IPagedCollection; 

的,如果從來沒有真正擊中,並迫使轉化率沒有工作壓力太大。所以問題是類的雙重定義。現在我在整個系統使用的類的「Commom」項目中定義了FullObjectList。問題消失了!

+0

你會得到什麼錯誤? – JeffH 2010-03-30 17:38:15

+0

好的,請嘗試。給我幾分鐘。 – jaderanderson 2010-03-30 17:47:20

回答

6

你做得對。試試這個(它也會失敗,但顯示的問題):

IPagedCollection pagedCollection = (FullListObject)value; 

編譯器應該接受這一點很好。如果不是,則有多個定義相互衝突IPagedCollection和/或FullListObject。如果在運行時失敗,則您的值不是FullListObject

+0

正確的錢。看起來,該項目的開發人員在兩個頁面中定義了FullListObject,如公共類。在問這個問題之前,我已經搜索「查找符號」,但結果只有一個頁面出現。通過文字查找爲我清除了路徑。 謝謝! – jaderanderson 2010-03-30 18:17:13

+0

不客氣...... :) – Lucero 2010-03-30 18:20:02

0

你的代碼應該可以正常工作 - 我可能不瞭解你想要完成什麼。

您不需要在該作業中投下value。只是做

IPagedCollection pagedCollection = value; 

就足夠了 - pagedCollection將被宣佈爲IPagedCollection,幷包含FullListObject。使用is運算符的檢查應該返回true。按照Lucero的建議做相反的事情會告訴你,你是否真的擁有像你期望的那樣的FullListObject。你能否用檢查向我們展示你的代碼,以便我們看到你的目標是什麼?

+0

Lucero已經到場了。這是一個雙重定義問題,它已經鎖定了演員和IS的操作。 我會在幾分鐘內發佈原始的竊聽代碼。謝謝你的時間! – jaderanderson 2010-03-30 18:23:54

0

是否FullListObject明確實施IPagedCollection?如果是的話,那麼根據Msdn

一個實現接口的類可以顯式地實現該接口的成員。當成員被明確實現時,它不能通過類實例訪問,而只能通過接口的實例訪問。

要標識顯式實現,請檢查接口成員實現。例如,

public interface IService 
{ 
    void Start(); 
    void Stop(); 
} 

public class Service : IService 
{ 
    #region IService Members 

    // note interface-dot-membername signature. explicit 
    // implementations *explicitly* declare the interface 
    // they are members of. this allows an implementation 
    // to contain members of the same name but of different 
    // interface declarations 
    void IService.Start() { } 
    void IService.Stop() { } 

    #endregion 
} 

如果事實確實如此,那麼你有兩個選項之一,

  1. 變化FullListObject實施IPagedCollection含蓄,或
  2. 投下你FullListObjectIPagedCollection實例正如你所做的那樣
+0

感謝您的反饋意見:D 我也嘗試過明確的定義。但這個問題是同一個班級的冗餘公共定義。 我會投你一票,如果我可以! – jaderanderson 2010-03-30 18:19:50

+0

不用擔心 - 很高興你已經整理好了! :) – 2010-03-30 18:25:16

+0

上面的評論者(johnny g?)是錯誤的,如果我正確理解他的陳述。 MSDN評論僅適用於用於訪問接口的對象引用類型。一個明確實現的接口可以通過實現類中的強制轉換(如圖所示的原始問題)以及隱式實現的接口來訪問。具有明確實現的接口只能防止調用者通過直接類引用訪問接口。因此,雖然明確實施的方法不是類公共方法,但它們仍然可公開訪問。 – 2011-10-28 16:01:32