我正在获取数据进行解析,并且我有一个通用解析器,我已在每个字段的基础上给出了有关数据的数据类型和格式(如果适用)的说明。
例如:
<Field Name="DateTime" Type="Pattern" Expression="\d{8} \d{2}\:\d{2}\:\d{2}" DataType="System.DateTime" Format="yyyyMMdd HH:mm:ss" />
类型可以是日期、整数、小数、任何值类型。格式可以是任何日期或数字格式。
Convert.ChangeType
没有仅采用自定义格式字符串的重载。我尝试实现 IFormatProvider
但我不知道如何实现它。
所以我试图弄清楚如何使这个方法以最通用的方式工作。
Public Function ConvertValue(Value As String, Type As System.Type, Format As String) As Object
End Function
日期数据的示例为 "20141215 10:07:25"{String}
,因此我只需调用 ConvertValue("20141215 10:07:25", GetType(日期时间), "yyyyMMdd HH:mm:ss")
最佳答案
只要您想要一个适合所有类型的通用函数,您就会有 If/Case 语句。我有一个通用转换器来帮助处理通常无法序列化的类型,但是转换为没有基础的独立函数会使它变得FUgly1:
Private Shared Function ConvertToT(Of T)(obj As String, fmt As String) As T
If GetType(T) Is GetType(DateTime) Then
Dim dt As DateTime
DateTime.TryParseExact(obj, fmt, CultureInfo.CurrentCulture,
DateTimeStyles.None, dt)
Return Convert.ChangeType(dt, GetType(T))
ElseIf GetType(T) Is GetType(Decimal) Then
Dim dec As Decimal
If Decimal.TryParse(obj, dec) Then
Return Convert.ChangeType(dec, GetType(T))
Else
Return Convert.ChangeType(Decimal.MinValue, GetType(T)) ' or exception
End If
ElseIf GetType(T) Is GetType(Double) Then
' etc etc etc
End If
End Function
由于您需要使用不同的函数进行转换,因此您会得到一个很长的 Case/If block 。即使使用像 ConvertFromInvariantString
这样的东西,你也有返回类型。一组扩展似乎没有那么麻烦,并且在这种情况下似乎更有用:
Module ParseExtensions
<Extension>
Public Function ParseToDate(dt As DateTime, data As String,
format As String) As DateTime
Dim newDate As DateTime
DateTime.TryParseExact(data, format, CultureInfo.CurrentCulture,
DateTimeStyles.None, newDate)
Return newDate
End Function
<Extension>
Public Function ParseToDecimal(dec As Decimal,
data As String) As Decimal
Dim newDec As Decimal
If Decimal.TryParse(data, newDec) Then
Return newDec
Else
Return Decimal.MinValue ' or exception
End If
End Function
End Module
使用及试用案例:
1 功能齐全,但丑陋。
关于.net - 使用类型和格式字符串将字符串转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27513445/