私はこのシンプルなツールが好きです:
public static class Klass
{
public static Klass<T> Of<T>(){ return Klass<T>.instance; }
}
public class Klass<T>
{
public static Klass<T> instance = null;
}
そして今、あなたはできる:
public K Process<T,K>(Klass<T> t, IEnumerable<K> items)
{
....
}
var aKey = Process(Klass.Of<string>(), mySetOfItems);
// aKey will be autotyped to a string
ただし、これには未使用のパラメーターを Process メソッドに追加する必要があることに注意してください。このパラメーターは、欠落している型を解決するためだけに使用されます。これが、「インスタンス」が常に null である理由です。値は重要ではありません。重要なのは、この null が Klass 型であるということだけです。
ただし、型パラメーターを明示的にProcess<string, ....>
渡す必要がないため、これにより 100% のように明示的な型パラメーターを使用する必要がなくなることに注意して<string>
ください。したがって、すべての型パラメーターは引数にバインドされ、これにより、コンパイラーは IEnumerable の項目を含む匿名型を自動的に解決できます。
編集:もっと複雑でトリッキーではありますが、もう1つ思い出しました。匿名型は完全にダックタイプ化されています。これは、「文字列キー、int 値」を持つ 1 つの匿名型が、別の場所で作成された「文字列キー、int 値」である 2 番目の匿名型とまったく同じクラスであることを意味します。これにより、 CastByExampleで説明されている小さなヘルパー メソッドを作成できます。
通常、匿名型を「指定」することはできません。これは、名前が付けられておらず、名前を書くことができないためです。しかし、ダックタイピングのおかげで、この貴重な記事は、定義されている匿名型をインターセプトする目的だけで、「サンプル」の匿名オブジェクトを返す実行されないラムダを提供する方法を示しています。表現の連鎖。非常にコーナーケースですが、興味深いことです。