我问了一个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的东西。
赛斯
答案 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)