1

私は次のような機能を持っています:

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?
4

2 に答える 2

3

T.whatever実際、ジェネリックでは使用できません。( の既知の制約に基づく) のインスタンスメソッドのみを使用できます。TT

たぶん次のようなもの:

// 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);
}

?

于 2012-05-02T05:40:48.977 に答える
1

リフレクションを使用してコードを単純化できます。

If c.Type.Primitive Then
   o = c.Type.GetMethod("Parse").Invoke(Nothing, New Object() {value, Globalization.NumberStyles.Any}) 
于 2012-05-02T05:50:51.350 に答える