6

ジェネリック インターフェイスに制約する必要があるジェネリック パラメーターTDを受け入れる関数があります。例えば:

public T DefinitionPopulate<T, TD>(IDataReader dr)
    where T: class, new()
    where TD: IEntityDefinition<T, Guid>, new()
{
    T t = new T();
    TD td = new TD();
    td.DoInterfaceMethod(t, dr);
    ...
    return t;
}

ただし、さまざまな IEntityDefinitions を使用します。

IEntityDefinition<SomeClass, Guid>
IEntityDefinition<SomeClass, int>
IEntityDefinition<SomeClass, double>
...etc...

しかし、私の関数DefinitonPopulateは 2 番目のジェネリック パラメーターをまったく使用しておらず、それが何であるかは気にしません。しかし、現在および将来のすべての定義を処理する必要があります。DefinitionPopulateそのため、配置されている IEntityDefinition の 2 番目のジェネリック パラメーターごとに 新しい署名を作成するのに行き詰まっているようです...

質問: 2 番目の型パラメーターが何であるかを気にしないことをコンパイラーに伝える方法はありますか? ワイルドカードみたいなもの?

編集:私がした質問に対する真の答えであるため、私が行った答えを受け入れました。ただし、この回答は優れた解決策を提供し、私が抱えていた根本的な問題を解決するために最終的に使用したものです-必ずチェックしてください!

4

4 に答える 4

0

同僚が近いことを指摘した後、将来の読者のために自分の投稿に答えます。私の最初の質問は、メソッドのジェネリック型パラメーターに関係していましたが、クラスのデフォルトを指定しようとしている場合は、「一種の」答え、つまり継承があります。

明確にするために、これは厳密には「デフォルト」ではありません。メソッドをオーバーロードしてから最も具体的なバージョンを呼び出すことに似ていますが、メソッドのオーバーロードと同様に、本質的に同じ結果が得られます。

例えば:

public class Parent<T1, T2>() { ... }
public class Parent<T1> : Parent<T1, int> { ... }

本質的に、T2 パラメータのデフォルトはint. すべての場合に適切というわけではありませんが、単純なケースであれば、これは良い回避策かもしれません。

于 2013-07-16T01:57:02.403 に答える