参加以下课程:
Public Class DocumentNumber
Private m_DOC_NUMBER As Integer = 0
Public Sub New(ByVal DOC_NUMBER As Integer)
m_DOC_NUMBER = DOC_NUMBER
End Sub
Public Sub New(ByVal DEPOT_CODE As String)
Dim ParseInput As Integer = 0
If Integer.TryParse(DEPOT_CODE, ParseInput) = False Then
m_DOC_NUMBER = 0
Else
m_DOC_NUMBER = ParseInput
End If
End Sub
''' <summary>
''' Returns the DOC_NUMBER as a zero-padded number, eg: 0000028374
''' </summary>
Public Overrides Function ToString() As String
Return Right("0000000000" & m_DOC_NUMBER.ToString(), 10)
End Function
''' <summary>
''' Returns the DOC_NUMBER as an integer, use .ToString() zero-padded version.
''' </summary>
Public Function ToInteger() As Integer
Return m_DOC_NUMBER
End Function
''' <summary>
''' Ensure that the DOC_NUMBER object has an implicit convert if assigned to an integer / string
''' </summary>
Public Shared Widening Operator CType(ByVal d As DocumentNumber) As Integer
Return d.ToInteger()
End Operator
Public Shared Widening Operator CType(ByVal d As DocumentNumber) As String
Return d.ToString()
End Operator
End Class
此类允许我从字符串或整数声明 DocID:
Dim DocumentID As New DOC_NUMBER("00123")
Dim DocumentID As New DOC_NUMBER(123)
这些可以通过调用ToInteger()
&以任何一种格式检索ToString()
:
Dim NewDocumentID as Integer = DocumentID.ToInteger()
Dim NewDocumentID as String = DocumentID.ToString()
注意两个Widening Operator
's - 它们也允许隐式转换含义.ToInteger()
,并且.ToString()
在将此类的实例分配给整数或字符串时可以省略,例如:
Dim NewDocumentID as Integer = DocumentID
Dim NewDocumentID as String = DocumentID
至今; 这一切都很好,我的下一个挑战是在分配给SqlParameter()
对象时添加隐式转换。
如您所知,如果您将对象分配给 new SqlParameter()
,则可以省略数据类型,并且SqlParameter()
对象会自动计算出来 - 但是,如果我用我的对象尝试这个,它显然会失败:
m_db_QueryParams.Add(New SqlParameter("@DOC_NUMBER", OrderNumber))
这会产生以下错误(这是可以理解的!):
不存在从对象类型 DocumentNumber 到已知托管提供程序本机类型的映射。
我的问题:是否可以将 a 添加Widening Operator
到我的类中,.ToString()
当分配给SqlParameter()
未提供数据类型的 a 时将返回它的方法(如下所示):
m_db_QueryParams.Add(New SqlParameter("@DOC_NUMBER", OrderNumber)) 'Convert as a string for the SqlParameter
我已将此问题标记为 VB 和 c# 作为任何一种语言的解决方案都是合适的。