読者です 読者をやめる 読者になる 読者になる

.NETのジェネリクス解決

プログラム

.NETのジェネリクス解決が意外とめんどくさい
型にジェネリクスがついている場合と関数にジェネリクスがついている場合がある

例えばListなんかは型にジェネリクスがついているのでこんな感じ

Dim list = GetType(List(Of ))
Dim list_add = list.GetMethod("get_Item") ' この時点で「T List(T).get_Item(int32)」
Dim list_str = list.MakeGenericType({GetType(String)})
Dim list_str_add = list_int32.GetMethod("get_Item") ' これで「string List(int32).get_Item(int32)」

例えばメソッドジェネリクスがついているとしたらこんな感じ

Dim list = GetType(List)
Dim list_add = list.GetMethod("get_Item") ' この時点で「T List.get_Item(int32)」
Dim list_str_add = list_add.MakeGenericMethod({GetType(String)}) ' これで「string List.get_Item(int32)」

list_addだけ見たらほぼ違いがないっていう
レシーバがIsGenericTypeなら型のジェネリクス解決して
list_addがIsGenericTypeなら関数のジェネリクス解決する感じ?

とりあえずList型だけ動かしたかったのでレシーバ決め打ちで解決をしたけど、型と関数が両方ジェネリクスだとどーしたらよかんべか

var xs = List(Int)()
List.Add(xs, 10)
var a0 = List.get_Item(xs, 0) # ←例えばApplyじゃなくてこの第一引数を使う?

型と関数に別々のジェネリクスを設定したケースを用意して同時にApplyできるか考えよう
・・・そんな都合のいいクラスあったか?