在对象上调用方法说"不允许后期绑定#34;

时间:2014-06-11 15:13:01

标签: vb.net casting

我有一个名为DtaDate的调用,它存储一个整数" key",一个字符串名称,一个日期字符串,以及一个从该字符串创建的Date对象。

我有一些代码需要接受类似日期的对象。我希望用户能够传递任何日期,例如 - 我将从中提取信息的Date对象,另一个DtaDate,带有日期的字符串,甚至是密钥,我和#39; ll用于从集合中查找DtaDate。

所以我有这个:

    Friend Sub New(NameIn As String, DateFormulaIn As String, Optional FromDateIn As Object = Nothing)
[stuff that works]
[check that we got a FromDateIn...]
            If TypeOf FromDateIn Is DtaDate Then
                fdk = FromDateIn.Key
                Ans.FromDate = fdk
VB告诉我" Option Strict On禁止后期绑定"。在其他情况下,字符串或整数是TypeOf,我使用CInt或CStr。但这是我第一次遇到铸造是非基础类型的情况。这个诀窍是什么?

2 个答案:

答案 0 :(得分:1)

您的签名定义FromDateIn As Object。稍后,您尝试通过调用DtaDate将其视为FromDateIn.Key。就编译器而言,FromDateIn只是Object,并且没有Key属性,而选项严格禁止后期绑定。

看起来您正在检查FromDateIn的类型,然后根据该行为进行操作,因此您需要做的就是将FromDateIn投射到DtaDate。有几种方法可以做到这一点。

fdk = CType(FromDateIn, DtaDate).Key
fdk = DirectCast(FromDateIn, DtaDate).Key
fdk = TryCast(FromDateIn, DtaDate).Key

DirectCast将转换给定变量(如果它是给定类型),或继承或实现它。

CType也会这样做,但也会检查是否存在从当前类型到指定类型的转换。这两个都会在失败时抛出InvalidCastException

TryCast仅适用于引用类型,其作用类似于DirectCast,但会在失败时返回Nothing而不是抛出异常。

另一种选择是提供三个独立的构造函数,每个构造函数都采用强类型变量,例如。

Friend Sub New(NameIn As String, DateFormulaIn As String)
  '...handle case where no date is provided
End Sub

Friend Sub New(NameIn As String, DateFormulaIn As String, FromDateIn As DateTime)
  '...handle case where a DateTime is passed in
End Sub

Friend Sub New(NameIn As String, DateFormulaIn As String, FromDateIn As DtaDate)
  '...handle case where a DtaDate is passed in
End Sub

Friend Sub New(NameIn As String, DateFormulaIn As String, FromDateIn As String)
  '...handle case where a string is passed in
End Sub

这样做会更多,但也更安全,因为传递给构造函数的类型可以在编译时而不是在运行时检查。

答案 1 :(得分:0)

我会使用TryCast()方法。如果它可以将源对象强制转换为指定的类型,那么它将被设置为Nothing。

在If块内引用DtaFromDate,它将是FromDateIn强制转换为DtaDate。

Friend Sub New(NameIn As String, DateFormulaIn As String, Optional FromDateIn As Object = Nothing)
[stuff that works]
[check that we got a FromDateIn...]

    Dim DtaFromDate As DtaDate
    TryCast(FromDateIn, DtaDate)
    If DtaFromDate IsNot Nothing Then
        fdk = DtaFromDate.Key
        Ans.FromDate = fdk

    End If