1

Typeインターフェイスを実装するオブジェクトにキーをマップする辞書を持つクラスがありますIWhatever

Type を入力として取得し、辞書でその型にマップされたオブジェクトを返す汎用関数を作成したいと考えています。

何かのようなもの :

public T get<T>(Type type) 

ここで、 T は型のインスタンスであり、型は implementsIWhateverです。

指定されたタイプのオブジェクトを返したくありませんObjectIwhatever返されるオブジェクトの型は、コンパイル時に明確に推測できます。だから私はそれが可能であるべきだと思います。

私はJavaでこれを行うことができました:

public T get<T>(Class<T extends IWhatever> type) { // implementation }

C# でこれを達成する方法はありますか? そうでない場合は、その理由と、どのような代替案を提案しますか?

4

3 に答える 3

7

私はあなたが欲しいと思います:

public T Get<T>() where T : IWhatever { ... } 

詳細については、型パラメーターの制約 (C# プログラミング ガイド)を参照してください。

もちろん、これは、クライアントがコンパイル時に型引数を簡単に提供できる場合にのみ役立ちます。内部的には、メソッドには多くの厄介さが必要になる場合があります。たとえば、次のようになります。

return (T) myDict[typeof(T)];
于 2013-04-25T14:39:02.523 に答える
0

最初の 2 つの文から、あなたが望んでいることは次のとおりだと思います。一意になるタイプの属性を決定する必要があります。持っているすべての型に GUID 属性が含まれていることを確認できます。

public class MyClass
{
  private Dictionary<GUID, object> _myDictionary;
  public AddObject(object objectToAdd)
  {
      _myDictionary.Add(objectToAdd.GUID, objectToAdd);
  }
  public object GetObject(Type typeToGet)
  {
    return _myDictionary[typeToGet.GUID];
  }
}

ディクショナリに各タイプの複数のオブジェクトを含める必要がある場合は、ディクショナリの値をオブジェクトのリストにすることができます。

于 2013-04-25T15:07:33.870 に答える
0

Javaの消去に惑わされていると思います。投稿から次の Java コードを検討してください (有効なコードになるように編集されています)。

public <T extends IWhatever> T get(Class<T> type) { // implementation }

この場合、typeジェネリック型情報はコンパイル時にしか利用できないため、パラメーターが必要になるだけです。これは、次のように記述できる C# には当てはまりません。

public T Get<T>()
    where T : IWhatever
{
    Type type = typeof(T);
    // rest of implementation
}
于 2013-04-25T14:42:24.530 に答える