你为什么不能在投射时使用GetType?

时间:2009-07-27 21:58:04

标签: .net inheritance casting

我问了一个still unanswered question,这将更多地阐明这个问题。

为什么我不能这样做......

_wizardDialog.UIRoot.Controls.Clear()
_wizardDialog.UIRoot.Controls.Add(TryCast(wizardUserControl, wizardUserControl.GetType))

为什么以这种方式使用GetType会失败。 try cast的参数是object和type。由于wizardUserControl.GetType返回一个类型,这是不合法的。 Visual Studio抱怨zh_cn未定义wizardUserControl.GetType。

底线是如何让WizardUserControl返回传递给我的方法的类型。这里调用的方法不应该是硬编码的类型......这就是所有这些OOP内容的重点......对吗?那你怎么做

如果可以的话,请阅读其他问题并在那里回答......这就是我要解决的问题。

我正在学习oop的东西。

赛斯

3 个答案:

答案 0 :(得分:6)

GetType()不返回类型。它返回类Type的实例,在运行时描述类型。但是,Type的实例不可替代需要编译时类型引用的实例(例如TryCast)。他们只是不同的东西。

以这种方式思考。 TryCast运算符具有明确的编译时结果类型。如果你使用从其他地方获得的Type对象(并且它可能是Random的条件,那么通常无法在编译时预测结果),那么编译时结果类型为TryCast

答案 1 :(得分:3)

以这种方式思考::

  • GetType()是一个函数。它返回一个Object。

    • 您不知道该类型是什么,或者您不需要问:)
  • 在投射对象时,您告诉编译器它的类型是什么。

你不能同时问一个类型是什么,它发生在运行时,并告诉编译器在编译时它在同一个地方是什么。

我猜你也可以把GetType(String)这样的东西想象成一个关键字。在这个例子中更清楚:

  // Makes sense, we tell the compiler what the object is.  We could still get a 
  // *runtime* exception, if we were lying to the compiler.
  Dim car = CType(vehicle, Car); 

  // this doesn't make sense, since we don't know what is in "anObj"
  Dim anObj As Object = "(I don't know what it is, thats why it's an object)"
  Dim car = ctype(anObj, anObj.GetType() )

  // and this is the clearest, in vb.  you can see the type is being used kinda like
  // a keyword.  it won't change, but a call to GetType could
  If TypeOf anObj is Car Then
   ...

在第二种情况下,您不知道“anObj”是什么类型。由于

答案 2 :(得分:0)

在代码中“硬编码”类型绝对没有错。在这方面,OOP编程的一般概念(特别是“编程到界面”的概念)是指定最通用描述您需要做什么的类。例如,如果我正在编写代码,我将UserControl的实例添加到一个表单,其中所有这些实例都从基类继承,我需要来自该基类的功能(您的WizardUserControlBase那么这就是我使用WizardUserControlBase类来引用我的控件的类型。

就这个问题而言,OOP并不是没有“硬编码”类型(在某种程度上它是硬编码的,即使它只是Object,因为它仍然是一个类) 。无视这一点,我不太确定你想要完成什么(因为看起来你正试图)把它投射到它自己的类型。您应该只能致电_wizardDialog.UIRoot.Controls.Add(wizardUserControl)