2011-11-15 18 views
4

さまざまなオブジェクトをインスタンス化できるファクトリメソッドのコレクションを作成したいと思います。タイプは実行時にのみ認識されます。私は簡単にこのためにデリゲートを作成することができます。ジェネリックデリゲートインスタンスのリストを作成するにはどうすればよいですか?

delegate T InstanceCreator<T>() 

が、これはコンパイラエラーを与える:

Dictionary<string, InstanceCreator<T>> 

を「記号Tを解決することはできません」ので、この場所で、私はちょうど

Dictionary<string, Delegate> 
を宣言します

私は、Addメソッドでタイプの特異性が欠けているのを補ってみましたが、同じ問題が発生しました。

public void AddFactory(string typeName, InstanceCreator<T> factory) 

のみInstanceCreator<T>代表者が私のコレクションに追加されますことを確実にするためのより良い方法はありますか?これが唯一のInstanceCreator<T>要素を追加することが可能にそれを制約します

public void AddFactory<T>(string typeName, InstanceCreator<T> factory) 

+0

もっとコードを見る必要があります。具体的には、ジェネリックオブジェクトを作成しようとしている実際のコードを表示したり、ジェネリック関数を呼び出したりできますか? –

答えて

1

あなたは一般的な方法をAddFactory行うことができます。

0

AddFactoryジェネリックメソッドください:Tから来ている

public void AddFactory<T>(string typeName, InstanceCreator<T> factory) 
1
public void AddFactory(string typeName,InstanceCreator<T> factory) 

を?あなたは、これが機能するための方法自体ジェネリックを行う必要があります。

public void AddFactory<T>(string typeName,InstanceCreator<T> factory) 
+0

入手しました。ありがとう... –

0

あなたはクラスやメソッドを介してジェネリック型パラメータを渡す必要があり....このよう

public void AddFactory<T>(string typeName,InstanceCreator<T> factory) 
0

を試してみてください。

私は標準Func< TResult >ジェネリックデリゲートを使用することをお勧めします:

クラスジェネリック型パラメータ:

public class FactoryRepository<T> 
{ 
    IDictionary<string, Func<T>> factoryCache; 

    public FactoryRepository() 
    { 
     this.factoryCache = new Dictionary<string, Func<T>>(); 
    } 

    public void AddFactory(string key, Func<T> factory) 
    { 
     this.factoryCache.Add(key, factory); 
    } 
} 

メソッドジェネリック型パラメータ:どのような範囲で

public void AddFactory<T>(string key, Func<T> factory) 
{ 
     // IDictionary<string, Func<T>> factoryCache 
     factoryCache.Add(key, factory); 
} 
+0

Downvoteの詳細は? – sll

+1

これがなぜ落とされたのか分かりません。 –

0

はあなたをしていますデリゲートを宣言する。

delegate T InstanceCreator<T>() 

あなたの方法で使用している名前空間レベルであなたがそこに訴えているTおよびT場合は同じではありません。デリゲートをクラスのスコープ内に宣言すると、デリゲートが機能するはずです。

0

あなたは文字列としてtypeNameを持っている必要がない場合、私はDictionary<Type, Delegate>を持つ提案し、それをこのようなものを使用します:また

Dictionary<Type, Delegate> factories = new Dictionary<Type, Delegate>(); 

public void AddFactory<T>(InstanceCreator<T> factory) 
{ 
    factories.Add(typeof(T), factory); 
} 

public InstanceCreator<T> GetFactory() 
{ 
    return (InstanceCreator<T>)factories[typeof(T)]; 
} 

を、独自のデリゲート型を作成する必要はありません、 Func<T>も同様に機能します。