2010-06-16 36 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