.net - 使用类型和格式字符串将字符串转换为对象

标签 .net vb.net

我正在获取数据进行解析,并且我有一个通用解析器,我已在每个字段的基础上给出了有关数据的数据类型和格式(如果适用)的说明。

例如:

<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

使用及试用案例:

enter image description here

1 功能齐全,但丑陋。

关于.net - 使用类型和格式字符串将字符串转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27513445/

相关文章:

vb.net - vb中的单例模式

javascript - Telerik ASP.Net Radgrid 显示/隐藏过滤器

c# - 堆栈面板的水平滚动不起作用

.net - 是否可以将系统.NET DLL调试为未优化?

c# - 使用 C# File 类编辑文件,但抛出异常

vb.net - Windows 媒体播放器用户界面

c# - 如何检查 HttpContext.Current.Response 是否有现有的 Header?

c# - 多个启动项目之间的 Visual Studio 延迟?

c# - Quartz.NET scheduler.Interrupt(jobKey) 正在中断所有事件作业

c# - LinkedList<T> 没有 ConvertAll?