【问题标题】:Converting Generic Type into reference type after checking its type using GetType(). How?在使用 GetType() 检查其类型后将通用类型转换为引用类型。如何?
【发布时间】: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


【解决方案1】:

一个技巧是在中间使用object来强制它:

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

或使用as:

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

【讨论】:

  • @Marc:那么它会将 Reader 转换为对象类型吗?使用 T 型有什么好处吗?我试图避免类型转换。它是相同的东西还是会先将其转换为对象类型,然后再转换为适当的类类型。 ?
  • @Shantanu Gupta :我们没有转换对象;我们只是在铸造参考。正如其他人所指出的,如果没有泛型,它的工作方式相同。但是,问题在于这样做您可能会引入拳击无论如何(如果您有值类型T)
  • @Marc:在这些类型的情况下,我什么时候应该使用 T 类型。我什么时候可以获得值类型和引用类型?
  • @Shantanu - 当它添加某些东西时,我会使用T。在您的情况下,它并没有真正添加任何东西。只需使用object
  • @Marc:添加一些意思,我没有完全理解你。我现在使用的是 object 而不是 T,但仍然想知道原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
相关资源
最近更新 更多