将泛型参数转换为基本数据类型

时间:2014-12-03 09:09:56

标签: .net vb.net generics type-conversion anonymous-types

我有以下Sub

Sub InsertValueToTextbox(of t)(byval valueToInsert as t)
Dim text as String
text = valueToInsert.tostring
'Now I put the text into a textbox...
End Sub

我的问题是,如果我得到的值有小数位,我想绕它。所以我试过了:

text = Math.Round(CType(valueToInsert, Decimal), 1).ToString

但编译器给出了错误,即t不能转换为十进制。 CDecConvert在这里也没有帮助。谁能告诉我如何将匿名类型转换为像decimal这样的原始数据类型?

2 个答案:

答案 0 :(得分:1)

您可以为所有数字类型和字符串实现的泛型参数添加IConvertivble约束:

Public Shared Function GetStringValueOf(Of t As {IComparable, IConvertible})(ByVal valueToInsert As t) As String
    Dim decimalValue As Decimal
    Try
        decimalValue = valueToInsert.ToDecimal(Globalization.NumberFormatInfo.CurrentInfo)
        Return Math.Round(decimalValue, 1).ToString()
    Catch ex As  System.FormatException
        ' silently ignore this '
    End Try
    Return valueToInsert.ToString(Globalization.NumberFormatInfo.CurrentInfo)
End Function

然后这个有效:

Dim result1 As String = GetStringValueOf("Test")    ' Test '
Dim result2 As String = GetStringValueOf("100,678") ' 100,7 -> comma is my decimal separator'
Dim result3 As String = GetStringValueOf(100.678)   ' 100,7 '

结果:1​​00,7

顺便说一句,将文本插入TextBox并不是那种方法的工作。

答案 1 :(得分:1)

与Tim的方法类似,但没有抛出异常,您可以检查传入的实际类型,并且只对您感兴趣的数字类型进行舍入:

Function InsertValueToTextbox(Of t As IConvertible)(ByVal valueToInsert As t) As String
    Dim text As String
    Dim formatter As IFormatProvider = CultureInfo.CurrentCulture

    Select Case GetType(t)
        Case GetType(System.Decimal)
            text = Math.Round(valueToInsert.ToDecimal(formatter), 1).ToString
        Case Else
            text = valueToInsert.ToString(formatter)
    End Select

    Return text
End Function

注意我将其更改为一个函数,因此它返回字符串值,使其更具可重用性