VB.Net中能否在函数内获取赋值操作的预期数据类型?
VB.Net自动获取赋值目标类型的Null转换函数实现方案
对接老旧MySQL数据库时,常遇到字段为NULL/DBNull值、数据类型不匹配(如整数0、双精度0、空字符串、字符串"0"等)的问题,导致数据交互报错。为此编写的ncc(Null Catch Convert)转换函数虽能处理这些问题,但每次调用需手动传入目标类型参数,希望实现自动获取赋值操作的预期类型,简化调用逻辑。
可行实现方案
1. 泛型函数(推荐)
泛型可以在编译时确定目标类型,无需手动传递Type参数,同时保留类型安全性,是最优方案。
Public Function ncc(Of T)(obj As Object) As T ' 处理Null/DBNull情况 If obj Is DBNull.Value OrElse obj Is Nothing Then ' 根据目标类型返回默认值:字符串返回空串,数值类型返回0 Return If(GetType(T) Is GetType(String), CType("", T), CType(Activator.CreateInstance(T), T)) End If ' 处理类型不匹配场景 Dim strVal As String = obj.ToString().Trim() Select Case GetType(T) Case GetType(Long) If String.IsNullOrEmpty(strVal) OrElse strVal = "0" Then Return CType(0L, T) End If Return CType(Long.Parse(strVal), T) Case GetType(String) If strVal = "0" Then Return CType("", T) Return CType(strVal, T) ' 可扩展其他类型的转换逻辑 Case Else Return CType(Convert.ChangeType(obj, GetType(T)), T) End Select End Function
调用方式简化为:
Dim table As DataTable adapter.Fill(table) Dim strinfo As String = ncc(Of String)(table.Rows(0).Item(0)) Dim intinfo As Long = ncc(Of Long)(table.Rows(0).Item(0))
2. 扩展方法+泛型(增强可读性)
将泛型函数封装为DataRow的扩展方法,让调用更贴合VB.Net的语法习惯:
Imports System.Runtime.CompilerServices Module DataRowExtensions <Extension()> Public Function ncc(Of T)(row As DataRow, columnIdentifier As Object) As T Dim obj As Object = row.Item(columnIdentifier) ' 复用转换逻辑 If obj Is DBNull.Value OrElse obj Is Nothing Then Return If(GetType(T) Is GetType(String), CType("", T), CType(Activator.CreateInstance(T), T)) End If Dim strVal As String = obj.ToString().Trim() Select Case GetType(T) Case GetType(Long) If String.IsNullOrEmpty(strVal) OrElse strVal = "0" Then Return CType(0L, T) End If Return CType(Long.Parse(strVal), T) Case GetType(String) If strVal = "0" Then Return CType("", T) Return CType(strVal, T) Case Else Return CType(Convert.ChangeType(obj, GetType(T)), T) End Select End Function End Module
调用方式更直观:
' 按列索引调用 Dim strinfo As String = table.Rows(0).ncc(Of String)(0) ' 按列名调用 Dim intinfo As Long = table.Rows(0).ncc(Of Long)("column_name")
3. 隐式转换(不推荐)
开启Option Strict Off后,允许隐式类型转换,可实现无需指定类型的调用,但会损失类型安全性,容易引发运行时异常,仅适合快速原型开发:
Option Strict Off Public Function ncc(obj As Object) As Object If obj Is DBNull.Value OrElse obj Is Nothing Then Return Nothing End If Dim strVal As String = obj.ToString().Trim() ' 处理转换逻辑 If strVal = "0" OrElse String.IsNullOrEmpty(strVal) Then Return 0 End If Return strVal End Function
调用示例:
Dim strinfo As String = ncc(table.Rows(0).Item(0)) Dim intinfo As Long = ncc(table.Rows(0).Item(0))
关键说明
VB.Net无法让函数直接“感知”赋值操作的目标类型(运行时无法获取赋值语句的左侧类型),泛型方案通过编译时确定目标类型T,间接实现了“自动获取预期类型”的需求,同时兼顾了代码安全性和可读性,是生产环境的首选方案。
内容的提问来源于stack exchange,提问作者Luke Krell
相关产品推荐
相关产品推荐

