【问题标题】:Why can't you use GetType when casting?为什么在投射时不能使用 GetType?
【发布时间】:2010-11-14 12:31:21
【问题描述】:

我问了一个still unanswered question,这会更清楚地说明这个问题。

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

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

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

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

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

我正在学习 oop 的东西。

赛斯

【问题讨论】:

    标签: .net inheritance casting


    【解决方案1】:

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

    这样想。 TryCast 运算符具有明确的 compile-time 结果类型。如果您使用从其他地方获得的Type 对象(它可能是Random 的条件,因此一般无法在编译时预测结果),那么应该是什么编译时 TryCast的结果类型?

    【讨论】:

      【解决方案2】:

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

      就这个问题而言,OOP 并不是没有“硬编码”类型(在某种程度上它必须被硬编码,即使它只是 Object,因为这仍然是一个类)。忽略这一点,我不太确定您要通过(看起来您正在尝试)将其转换为自己的类型来完成什么。你应该可以打电话给_wizardDialog.UIRoot.Controls.Add(wizardUserControl)

      【讨论】:

      • 感谢您的回答。我明白在某些时候你必须引用一个具体的类型。但是此代码需要能够加载任何类型的实现 IWizardUserControl 的用户控件。在代码的这一点上,它可能是任意数量的实现。所以我要说的是,InitUserControl 中的这段代码不应该有对任何 IWizardUserControl 实现的硬编码引用。这违背了 OOP 的目的。 BTW _wizardDialog.UIRoot.Controls.Add(wizardUserControl) 是我的代码不起作用。赛斯
      【解决方案3】:

      这样想::

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

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

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

      我想您也可以将 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”是什么类型。自从

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        相关资源
        最近更新 更多