【发布时间】:2010-06-16 09:23:47
【问题描述】:
我正在尝试调用在类RFIDeas_Wrapper(正在使用的dll)中定义的函数。
但是当我检查阅读器的类型,然后我用它来调用函数时,它显示错误Cannot convert type T to RFIDeas_Wrapper.
编辑
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)Reader).OpenDevice();
((AlienReader)Reader).TagCollection;
我希望这条线能够毫无问题地执行。因为 Reader 将始终是我指定的类型。 如何让编译器理解同样的事情。
【问题讨论】:
-
如果你需要
RFIDeas_Wrapper,为什么要使用T(可以是任何东西)? -
@Bobby:我可以得到任何类型的读者。即 AlienReader 在 else if 部分等等。我必须使此功能适用于所有返回我列表集合的读者。我认为直接传递类对象并获得结果而不用一次又一次地编写相同的代码来获得一些输出应该是一种更好的方法。
-
我看不出在这里使用泛型的意义,因为你没有得到任何编译时类型安全。它也可以是对象。
-
@Stefan:如果您已经阅读了我的编辑,那么为什么它不是类型安全的,我在执行某些操作之前检查了它的数据类型。它不会进入 if 或 else 部分,直到它不匹配适当的数据类型。
-
视情况而定。如果可以的话,更改 Readers 的实现。如果你不能,你的读者的来源是什么?您不能有两个 GetTagCollection 重载并在创建读取器实例时调用它吗?或者,您可以为将实现该方法的每种类型的阅读器创建包装器。这一切都取决于您拥有的条件。
标签: c# generics type-conversion casting