Возьмем следующий класс:Возможно ли реализовать расширенный оператор для SqlParameter?
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)
И они могут быть retreived в любом формате, позвонив ToInteger()
& ToString()
:
Dim NewDocumentID as Integer = DocumentID.ToInteger()
Dim NewDocumentID as String = DocumentID.ToString()
Обратите внимание, что два Widening Operator
- эти также позволяет неявное преобразование означает .ToInteger()
и .ToString()
может быть опущен при назначении экземпляра этого класса в целое число или строку, например:
Dim NewDocumentID as Integer = DocumentID
Dim NewDocumentID as String = DocumentID
До сих пор; это все отлично работает, моя следующая задача заключается в добавлении неявного преобразования при назначении объекту SqlParameter()
.
Как вы знаете, если назначить объект на новый SqlParameter()
, тип данных может быть опущена и SqlParameter()
объект будет понять это автоматически - однако, если я пытаюсь это с моим объектом, очевидно, не удается:
m_db_QueryParams.Add(New SqlParameter("@DOC_NUMBER", OrderNumber))
Это дает следующее сообщение об ошибке (и это понятно!):
отображения не существует от типа объекта НомерДокумента к известному под управлением поставщиком собственный типа.
Мой вопрос: Можно ли добавить Widening Operator
в мой класс, который будет возвращать это .ToString()
метод, когда будучи назначен SqlParameter()
без указания типа данных поставляется (как это):
m_db_QueryParams.Add(New SqlParameter("@DOC_NUMBER", OrderNumber)) 'Convert as a string for the SqlParameter
Я отметили этот вопрос, поскольку оба варианта VB & C# в качестве решения на любом языке были бы подходящими.
Как насчет функции 'ToSqlParameter (имяПараметра в виде строки) в качестве SqlParameter', где вы создаете и вернуть новый SqlParameter и excplicitly Сформулируем SqlDataType, а затем вызвать его как' m_db_QueryParams.Add (OrderNumber.ToSqlParameter ("@ DOC_NUMBER «))'? – Corak
Можете также просто вызвать метод '.ToString()', если это так). Все дело в том, чтобы взять на себя ответственность разработчика за выбор правильного метода '.ToX()' (SQL '@DOC_NUMEBER 'param всегда будет требовать строку), не нужно, чтобы разработчик набирал' .ToString() 'каждый раз, когда они используют его в SQL, когда я должен иметь возможность неявно выполнять это преобразование автоматически - надеюсь, что это имеет смысл :) – HeavenCore