Я сделал класс, чтобы действовать как вариант MathVariant
, который будет содержать любое значение, но всегда будет использовать числовое значение (0 или 1) для простой арифметики. Мне все еще нужно больше тестировать с помощью умножения и деления, но кроме этого он работает хорошо.VB.Net make class ведет себя как примитивный тип, например. String или Integer
Я хотел бы для MathVariant
вести себя как примитивный тип, поэтому я могу использовать его как обычную переменную. поэтому прямо сейчас, когда я хочу получить значение, я должен получить свойство .Value
.
Это пример кода, который я хотел бы, чтобы иметь возможность написать использовать
Dim SomeValue As MathVariant = "12.11"
Dim AnotherValue As MathVariant = "3"
Dim Result As MathVariant = SomeValue + AnotherValue
Console.WriteLine(Result) 'prints MyNameSpace.MathVariant
Console.WriteLine(Result.Value) 'returns desired result (15.11)
Я хотел бы просто быть в состоянии использовать экземпляр класса непосредственно получить его значение. Я долго искал и не уверен, что это возможно или как это сделать. Я не уверен, что мне нужно избавиться от свойства Value или если есть зарезервированное имя или что-то, я понимаю, что мой код класса очень длинный, поэтому, если кто-то может объяснить изменения, которые нужно было бы сделать, и, возможно, показать пример суб или двух, которые будут изменены.
Public Class MathVariant
Private m_Value As String
'public version
Public Property Value() As Object
Get
Dim m_value1 As Double
If Double.TryParse(m_Value, m_value1) Then
Return m_value1
End If
Return m_Value
End Get
Set(value As Object)
m_Value = value.ToString()
End Set
End Property
Public Sub New(Value As String)
m_Value = Value
End Sub
Public Shared Widening Operator CType(ByVal value As String) As MathVariant
Return New MathVariant(value)
End Operator
Public Shared Widening Operator CType(ByVal value As Decimal) As MathVariant
Return New MathVariant(value.ToString())
End Operator
Public Shared Widening Operator CType(ByVal value As Double) As MathVariant
Return New MathVariant(value)
End Operator
Public Shared Widening Operator CType(ByVal value As Integer) As MathVariant
Return New MathVariant(value.ToString())
End Operator
Public Shared Narrowing Operator CType(ByVal value As MathVariant) As Double
Return value.ToDouble()
End Operator
Public Shared Narrowing Operator CType(ByVal value As MathVariant) As Integer
Return Convert.ToInt32(value.ToDouble())
End Operator
Public Shared Narrowing Operator CType(ByVal value As MathVariant) As String
Return value.Value.ToString()
End Operator
Public Function ToDouble() As Double
Dim test As Double
If Double.TryParse(Me.Value.ToString(), test) Then
Return test
End If
Return 0
End Function
'addition
Public Shared Operator +(value1 As MathVariant, value2 As MathVariant) As MathVariant
If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then
Return value1.ToDouble() + value2.ToDouble()
ElseIf TypeOf value1.Value Is Double Then
Return value1.ToDouble() + 0.0
ElseIf TypeOf value2.Value Is Double Then
Return 0.0 + value2.ToDouble()
End If
Return 0
End Operator
Public Shared Operator +(value1 As MathVariant, value2 As Object) As MathVariant
If TypeOf value1.Value Is Double And TypeOf value2 Is Double Then
Return value1.ToDouble() + value2
ElseIf TypeOf value2 Is Double Then
Return 0.0 + value2
End If
Return 0.0
End Operator
Public Shared Operator +(value1 As MathVariant, value2 As Double) As MathVariant
If TypeOf value1.Value Is Double Then
Return value1.ToDouble() + value2
End If
Return 0.0 + value2
End Operator
Public Shared Operator +(value1 As MathVariant, value2 As Integer) As MathVariant
If TypeOf value1.Value Is Double Then
Return value1.ToDouble() + Convert.ToDouble(value2)
End If
Return 0.0 + Convert.ToDouble(value2)
End Operator
'subtraction
Public Shared Operator -(value1 As MathVariant, value2 As MathVariant) As MathVariant
If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then
Return value1.ToDouble() - value2.ToDouble()
ElseIf TypeOf value1.Value Is Double Then
Return value1.ToDouble() - 0.0
ElseIf TypeOf value2.Value Is Double Then
Return 0.0 - value2.ToDouble()
End If
Return 0
End Operator
Public Shared Operator -(value1 As MathVariant, value2 As Object) As MathVariant
If TypeOf value1.Value Is Double And TypeOf value2 Is Double Then
Return value1.ToDouble() - value2
ElseIf TypeOf value2 Is Double Then
Return 0.0 - value2
End If
Return 0.0
End Operator
Public Shared Operator -(value1 As MathVariant, value2 As Double) As MathVariant
If TypeOf value1.Value Is Double Then
Return value1.ToDouble() - value2
End If
Return 0.0 - value2
End Operator
Public Shared Operator -(value1 As MathVariant, value2 As Integer) As MathVariant
If TypeOf value1.Value Is Double Then
Return value1.ToDouble() - Convert.ToDouble(value2)
End If
Return 0.0 - Convert.ToDouble(value2)
End Operator
'division
Public Shared Operator /(value1 As MathVariant, value2 As MathVariant) As MathVariant
If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then
Return value1.ToDouble()/value2.ToDouble()
ElseIf TypeOf value1.Value Is Double Then
Return value1.ToDouble()/1.0
ElseIf TypeOf value2.Value Is Double Then
Return 1.0/value2.ToDouble()
End If
Return 0
End Operator
Public Shared Operator /(value1 As MathVariant, value2 As Object) As MathVariant
If TypeOf value1.Value Is Double And TypeOf value2 Is Double Then
Return value1.ToDouble()/value2
ElseIf TypeOf value2 Is Double Then
Return 1.0/value2
End If
Return 0.0
End Operator
Public Shared Operator /(value1 As MathVariant, value2 As Double) As MathVariant
If TypeOf value1.Value Is Double Then
Return value1.ToDouble() + value2
End If
Return 0.0 + value2
End Operator
Public Shared Operator /(value1 As MathVariant, value2 As Integer) As MathVariant
If TypeOf value1.Value Is Double Then
Return value1.ToDouble() + Convert.ToDouble(value2)
End If
Return 0.0 + Convert.ToDouble(value2)
End Operator
'multiplication
Public Shared Operator *(value1 As MathVariant, value2 As MathVariant) As MathVariant
If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then
Return value1.ToDouble() * value2.ToDouble()
ElseIf TypeOf value1.Value Is Double Then
Return value1.ToDouble() * 1.0
ElseIf TypeOf value2.Value Is Double Then
Return 1.0 * value2.ToDouble()
End If
Return 1.0
End Operator
Public Shared Operator *(value1 As MathVariant, value2 As Object) As MathVariant
If TypeOf value1.Value Is Double And TypeOf value2 Is Double Then
Return value1.ToDouble() * value2
ElseIf TypeOf value2 Is Double Then
Return 1.0 * value2
End If
Return 1.0
End Operator
Public Shared Operator *(value1 As MathVariant, value2 As Double) As MathVariant
If TypeOf value1.Value Is Double Then
Return value1.ToDouble() + value2
End If
Return 1.0 * value2
End Operator
Public Shared Operator *(value1 As MathVariant, value2 As Integer) As MathVariant
If TypeOf value1.Value Is Double Then
Return value1.ToDouble() * Convert.ToDouble(value2)
End If
Return 1.0 * Convert.ToDouble(value2)
End Operator
'less than
Public Shared Operator <(value1 As MathVariant, value2 As MathVariant)
If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then
Return value1.Value < value2.Value
ElseIf TypeOf value1.Value Is Double Then
Return value1.Value < 0
ElseIf TypeOf value2.Value Is Double Then
Return 0 < value2.Value
End If
Return False
End Operator
Public Shared Operator <(value1 As MathVariant, value2 As Double)
If TypeOf value1.Value Is Double Then
Return value1.Value < value2
Else
Return 0 < value2
End If
Return False
End Operator
Public Shared Operator <(value1 As MathVariant, value2 As Integer)
If TypeOf value1.Value Is Double Then
Return value1.Value < Convert.ToDouble(value2)
Else
Return 0.0 < Convert.ToDouble(value2)
End If
Return False
End Operator
'greater than
Public Shared Operator >(value1 As MathVariant, value2 As MathVariant)
If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then
Return value1.Value > value2.Value
ElseIf TypeOf value1.Value Is Double Then
Return value1.Value > 0
ElseIf TypeOf value2.Value Is Double Then
Return 0 > value2.Value
End If
Return False
End Operator
Public Shared Operator >(value1 As MathVariant, value2 As Double)
If TypeOf value1.Value Is Double Then
Return value1.Value > value2
Else
Return 0 > value2
End If
Return False
End Operator
Public Shared Operator >(value1 As MathVariant, value2 As Integer)
If TypeOf value1.Value Is Double Then
Return value1.Value > Convert.ToDouble(value2)
Else
Return 0.0 > Convert.ToDouble(value2)
End If
Return False
End Operator
'equal to
Public Shared Operator =(value1 As MathVariant, value2 As Object)
If TypeOf (value2) Is Double Then
Return Convert.ToDouble(value2).Equals(value1.ToDouble())
ElseIf TypeOf (value2) Is String Then
Return Convert.ToString(value2).Equals(value1.ToString())
End If
Return False
End Operator
'not equal
Public Shared Operator <>(value1 As MathVariant, value2 As Object)
Dim m_Type As Type = value2.GetType()
If TypeOf (value2) Is Double Then
Return Convert.ToDouble(value2).Equals(value1.ToDouble())
ElseIf TypeOf (value2) Is String Then
Return Convert.ToString(value2).Equals(value1.ToString())
End If
Return False
End Operator
End Class
EDIT:
Вот ссылка на .NetFiddle я сделал WTH код из выше.
https://dotnetfiddle.net/bFlyhG
Советуем сохранить значение в виде строки. Старайтесь всегда хранить его как фактический числовой тип. - Я не вижу проблемы, с которой вы столкнулись, только то, что арифметика не работает должным образом, так как ваш код показывает «3» вместо любого из двух вы сказали. Хотя я не думаю, что перегрузка оператора возможна, вместо этого используйте операторы преобразования. –
Я, как правило, с вами согласен, к сожалению, я в состоянии оценить одну переменную, которая может быть числом или строкой в виде числа. Проблема в том, что я хотел бы иметь доступ к сохраненному значению, не делая '.Value', поэтому используйте его как' Object' или 'Integer' – Jpsh
Снова я не вижу проблемы. Без '.Value' он работает так же хорошо для меня. Попробуйте переопределить метод ToString(). –