[英]VB.NET Generics
我有如下功能:
Function foo(ByVal c As CustomType, ByValue str as String) As Object
Dim o as Object
Select Case c.TypeName
Case "System.String"
If str = String.Empty Then
o = DBNull.Value
Else
o = value
End If
Case "System.Int64"
Try
o = Long.Parse(value, Globalization.NumberStyles.Any)
Catch
o = DBNull.Value
End Try
Case "System.Double"
Try
o = Double.Parse(value, Globalization.NumberStyles.Any)
Catch
o = DBNull.Value
End Try
Case "System.Int32"
Try
o = Int32.Parse(value, Globalization.NumberStyles.Any)
Catch
o = DBNull.Value
End Try
Case "System.DateTime"
Try
o = DateTime.Parse(value)
Catch
o = DBNull.Value
End Try
Return o
End Function
这个功能让我想写一个通用版本。 因为像C ++这样的.NET不允许部分特化(如果我错了,请纠正我),有什么方法可以使用泛型的任何特性。 我做了一个令人尴尬的尝试但失败了:
Function foo(Of T)(...) as Object
Dim o As Object
Try
o = T.Parse(...) 'This doesnt work
Catch
o = DBNull.Value
End Try
...
End Function
'Add functions for handling String and DateTime maybe?
实际上,你不能使用T.whatever
和泛型; 的唯一实例方法T
(基于已知的约束T
)可以被采用。
也许是这样的:
// return object since SQL parameter packing
static object Parse<T>(string value)
{
if (string.IsNullOrEmpty(value)) return DBNull.Value; // for SQL parameter
return TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value);
}
?
您可以使用反射以某种方式简化代码:
If c.Type.Primitive Then
o = c.Type.GetMethod("Parse").Invoke(Nothing, New Object() {value, Globalization.NumberStyles.Any})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.