3

たとえば、要素のジェネリック リストをメソッド パラメーターとして受け入れ、リストを構成しているオブジェクトのタイプに基づいて異なるアクションを実行するとします。例えば:

Private Sub DoStuff(Of T)(ByRef list As List(Of T) 
    If list.GetType() Is TypeOf(List(Of String) Then
        'Do some string stuff
    Else If list.GetType() Is TypeOf(List(Of Integer) Then  
        'Do some Integer stuff
    End If
End Sub

タイプが何であるかを確認する方法があればT、それも機能します。List(Of ParentClass)また、 の が であるかどうかを確認するように引数を設定しようとしましTypeOfたがList(Of SubClass)、 が意味をなさない List(Of ParentClass)タイプになることは決してないと言われています。List(Of SubClass)

4

3 に答える 3

8

T次のように、ジェネリック型を比較できます。

Private Sub DoStuff(Of T)(ByRef list As List(Of T))
    If GetType(T) = GetType(String) Then
        'Do some string stuff
    Else GetType(T) = GetType(Integer) Then  
        'Do some Integer stuff
    End If
End Sub

Selectまたは、ブロックとして実行することもできます。

Private Sub DoStuff(Of T)(ByRef list As List(Of T))
    Select GetType(T) 
        Case GetType(String)
            'Do some string stuff
        Case GetType(Integer)
            'Do some Integer stuff
    End Select
End Sub

言うまでもありませんが、そのようなタイプのチェックはできるだけやめて、できるだけ避けるべきであると付け加えておく必要があると思います。そのようなことを行うと、乱雑なスパゲッティ コードが発生し、ジェネリック パラメーターを使用する目的全体が無効になります。通常、このようなことをしなければならなくなったときは、何かがうまくいかず、設計を再考する必要があることを示しています。

List(Of ParentClass)との不一致に関する限り、これはList(Of SubClass)人々がジェネリクスに対してよくする混乱です。ジェネリックが機能する方法は、ジェネリック型パラメーターに提供できる可能な各型が、他のデータ型とはまったく関係のない、完全に別のデータ型として扱われることです。そのため、関係や共有に関係なく、まったく異なるタイプとして扱われる場合がList(Of X)あります。つまり、基本的には、次のように新しい型を作成するための省略形です。List(Of Y)XY

Public Class ListOfSubClass
    Inherits List(Of SubClass)
End Class

Public Class ListOfParentClass
    Inherits List(Of ParentClass)
End Class

ListOfParentClassこれを行った場合、 との互換性は期待ListOfSubClassできません。相互に関係がないためです。同様に、ジェネリックもそのように機能するとは思わないでください。

編集

同じジェネリック クラスの異なる型の間のキャストの非互換性について私が言ったことは真実ですが、それはもはやすべての話ではありません。Visual Studio 2010 およびフレームワークの 4.0 バージョンの時点で、.NET はその問題の解決に役立つ共分散と反分散をサポートしています。詳細については、MSDN の記事を参照してください。

于 2013-05-15T16:34:39.037 に答える
6

コード パスを決定するためにジェネリック パラメーターを検査する必要がある場合、メソッドは完全にジェネリックではなく、このケースはオーバーロードされたメソッドを使用して処理する必要があります。

Private Sub DoStuff(ByRef list as List(Of String))
Private Sub DoStuff(ByRef list as List(Of Integer))

ParentClassこれは、 andを使用する場合も同様に機能しSubClassます。最も具体的なオーバーロードが呼び出されます。

DoStuff本当に汎用的な共有側面がある場合は、それらを別のヘルパー メソッドに抽出します。

そうは言っても、をT使用してのタイプを確認できますGetType(T)

于 2013-05-15T16:46:26.283 に答える
0

ジェネリック リストの種類ごとに同じ名前の拡張メソッドを作成することはできますか?

C# では次のようになります。

var listOfStrings = new List<string>();
listOfStrings.DoStuff() //the extension method

var listOfInts = new List<int>();
listOfInts.DoStuff() //the extension method

拡張メソッドは次のようになります。

public static class listExtensions
{
   public static void DoStuff(this IList<string> theList)
   {
       // Stuff with strings
   }
   public static void DoStuff(this IList<int> theList)
   {
       // Stuff with ints
   }
}
于 2013-05-15T16:44:25.003 に答える