2014-05-07 46 views
0

我輸入的數據包含表示日期的字符串。這些可能是日期字符串,如「2000-01-01」,但他們可能會說「5Y」,意思是「五年」。所以我有一個小的類來跟蹤這些...非索引字段上的「default-like」屬性

Public Class FlexDate 
    Friend Input As String = "" 
    Friend Value As DateTime = EarliestDate 
... 

您可能會發現一個出租對象中這些FlexDates之一,像「myRent.StartDate」。 「問題」是我希望將Value作爲字段名稱進行訪問。例如...

myRent.StartDate.Input - returns a string 
myRent.StartDate.Value - returns a DateTime 

那麼,關於....

myRent.StartDate - myRent.StartDate.Value 

有沒有辦法做到這一點?它有點像某種方式的默認屬性,但沒有索引,所以我不認爲你可以在這種情況下使用該機制?

回答

1

你可以使用DefaultMemberAttribute指定的默認屬性:

<System.Reflection.DefaultMember("Value")> _ 
Public Class FlexDate 
    '... 
End Class 

但是,這不會幫助你在VB中,因爲你不能訪問它。它只是含糊不清 - 你的意思是物體還是它的財產。

但是你可以實現的隱式轉換:

Class FlexDate 
    '... 
    Public Shared Widening Operator CType(this As FlexDate) As DateTime 
     Return this.Value 
    End Operator 
End Class 

Dim date As New FlexDate 
Dim value As DateTime = date 'Works with the implicit operator 
+0

尼科,這種反應促使我下了兔子洞,我當時真應該早就走了下來。運營商很酷!但是有一個問題/問題:上面的方法簽名在Format(myRent.StartDate ...)之類的代碼中不起作用。我可以在格式中使用CDate修復此問題,但有沒有更好的解決方案? –

+0

不明白你的意思。什麼是CDate,我們在討論什麼格式? –

+0

對不起尼科,我應該更清楚一點:有問題的數據是一個DateTime對象,正如你在回覆中提到的那樣。所以如果對FlexDate的調用來自採用DateTime的方法,那麼它可以正常工作。但是,如果調用來自格式等多態方法,則運行時無法決定要調用的轉換。如果你像CDate(myRent.FlexDate)一樣包裝它,那麼運行時會將其計算出來,但是這可能會破壞目的。 –

相關問題