3

タイプ T および K に関して記述されたメソッドがあります

public K Process<T,K> (IEnumerable<T> set)
{
    //do stuff to set
}

LINQ を使用してデータのプロジェクションを取得し、処理のために送信する必要があります

var dataSlice=records.Select(r => new { name = r.GetName(), id = r.GetId() });
string result =  Process <?, string>(dataSlice);

何を指定すればよいですか?(出来れば)

4

3 に答える 3

1

私はこのシンプルなツールが好きです:

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で説明されている小さなヘルパー メソッドを作成できます。

通常、匿名型を「指定」することはできません。これは、名前が付けられておらず、名前を書くことができないためです。しかし、ダックタイピングのおかげで、この貴重な記事は、定義されている匿名型をインターセプトする目的だけで、「サンプル」の匿名オブジェクトを返す実行されないラムダを提供する方法を示しています。表現の連鎖。非常にコーナーケースですが、興味深いことです。

于 2013-04-08T21:55:05.677 に答える
0

簡単に言えば、メソッドを再設計しないとできないということです。C# では、すべての型パラメーターを指定するか、何も指定しない必要があります。

1 つのオプションはProcess、別の API でメソッドをラップすることです。

public class Processor<T>
{
    public K Process<K>() { ... }
}

...

public Processor<T> CreateProcessor<T> (IEnumerable<T> set)
{
    return new Processor<T>(set)
}

...

string result =  CreateProcessor(dataSlice).Process<string>();

これは代替手段ですが、直感的ではありませんが、IMO:

public static class Process<K>
{
    public static K From<T>(Ienumerable<T> set) { ... }
}

...

string result = Process<string>.From(dataSlice);
于 2013-04-08T21:51:35.603 に答える