2010-06-16 41 views
3

我正在嘗試調用類RFIDeas_Wrapper(正在使用dll)中定義的函數。 但是,當我檢查類型讀者的之後,我用它來調用函數它讓我錯誤Cannot convert type T to RFIDeas_Wrapper.使用GetType()檢查其類型後,將通用類型轉換爲引用類型。怎麼樣?

編輯

private List<string> GetTagCollection<T>(T Reader) 
      { 
       TagCollection = new List<string>(); 
       if (Reader.GetType() == typeof(RFIDeas_Wrapper)) 
       { 

        ((RFIDeas_Wrapper)Reader).OpenDevice(); 
        // here Reader is of type RFIDeas_Wrapper 
        //, but i m not able to convert Reader into its datatype. 

        string Tag_Id = ((RFIDeas_Wrapper)Reader).TagID(); 
        //Adds Valid Tag Ids into the collection 
        if(Tag_Id!="0") 
         TagCollection.Add(Tag_Id); 
       } 
       else if (Reader.GetType() == typeof(AlienReader)) 
        TagCollection = ((AlienReader)Reader).TagCollection; 

       return TagCollection; 
      } 

((RFIDeas_Wrapper)閱讀器).OpenDevice();

((AlienReader)Reader).TagCollection;

我想這條線沒有任何問題執行。由於讀者將永遠是我指定的類型。 如何讓編譯器理解同樣的事情。

+1

爲什麼你使用'T'(可以是任何東西),如果您需要'RFIDeas_Wrapper'? – Bobby 2010-06-16 09:26:30

+0

@Bobby:我可以找到任何一種閱讀器。即AlienReader在其他部分如此等等。我必須使這個函數適用於所有返回List Collection的讀者。我認爲直接傳遞類對象並獲得結果時應該是一種更好的方法,而不必一次又一次地寫相同的代碼來獲得某些輸出。 – 2010-06-16 09:27:55

+0

我看不出在這裏使用泛型的一點,因爲你沒有得到任何編譯時類型的安全。它也可能是對象。 – 2010-06-16 09:33:59

回答

3

一個竅門是使用object在中間,迫使它:

if (Reader is RFIDeas_Wrapper) 
{ 
    ((RFIDeas_Wrapper)(object)Reader).OpenDevice(); 
    ... 
} 

as使用:

RFIDeas_Wrapper wrapper = Reader as RFIDeas_Wrapper; 
if (wrapper != null) 
{ 
    wrapper.OpenDevice(); 
    ... 
} 
+0

@Marc:那麼它會將Reader轉換爲對象類型。我有使用T型的好處嗎?我試圖避免類型轉換。它是相同的東西,還是將它轉換爲對象類型,然後將其轉換爲適當的類類型。 ? – 2010-06-16 09:40:59

+0

@Shantanu Gupta:我們不是在轉換對象;我們只是簡單地參考。正如其他人所指出的那樣,如果沒有泛型,它的工作方式也是一樣的。但問題是,通過這樣做,你可能會引入拳擊*無論如何*(如果你有價值型T) – 2010-06-16 09:42:30

+0

@Marc:什麼時候應該在這些類型的情況下使用T型。當我可能獲得值類型和引用類型? – 2010-06-16 09:44:45