2011-03-09 19 views
2

ARGデリゲートとジェネリックインスタンスを作成します。私はTの新しいインスタンスを作成しようとしていますが、問題はTがコンストラクタに代理引数を持っていることです。唯一[オブジェクト]タイプが[アクティベータ]で引数として許可されているようは、私はジェネリックを導入することにより、いくつかのコードをリファクタリングしようとしている、と私は行き詰まって

public delegate IOrders DoStuffDelegate(); 


public class GenericBoss<T> where T:Worker 
{ 

    public void DelegateWork() 
    { 
     T worker = Activator.CreateInstance(typeof(T), new[]{GiveOrders}) 
     worker.Work(); 
    } 

    public IOrders GiveOrders() 
    { 
     return new OrderFromTheBoss(); 
    } 
} 

public class Worker 
{ 
    private readonly DoStuffDelegate _takeOrders; 

    public Worker(DoStuffDelegate takeOrders) 
    { 
     _takeOrders = takeOrders; 
    } 

    public void Work() 
    { 
     _takeOrders(); 
    } 
} 

しかし、これは、動作しません:何私が目指していたことは、このようなものでした。私はコンストラクタを変更することは許されていないので、デリゲートを別の場所に移動することはできません。

はアウト方法はありますか、またはジェネリックは、ここではオプションではありませんか?

よろしく、 モートン

答えて

3

問題は、コンパイラは、あなたのメソッドグループに変換したいデリゲート知らないことです。 - あなたは、おそらくDelegate.CreateDelegateをコールする必要があると思い

object[] args = new object[] { new DoStuffDelegate(GiveOrders) }; 
T worker = (T) Activator.CreateInstance(typeof(T), args); 

または

DoStuffDelegate giveOrders = GiveOrders; 
object[] args = new object[] { giveOrders }; 
T worker = (T) Activator.CreateInstance(typeof(T), args); 

デリゲート型は、各Tのために異なっている場合、それは難しいです:それは常にDoStuffDelegateだ場合、あなたはこれを行うことができます反射:(私は思う

+0

を経て発見された適切なデリゲート型のインスタンスを作成するために 'Activator.CreateInstance'は、この場合にはオブジェクトを返す?' as'キャストやジェネリックバージョンがあるべき適用される。 –

+0

@Danny:はい、キャストが必要になる - にそれを追加します、私は物事の引数側に焦点を当てた、私はOPのオリジナルの問題であると考えている:) –

+0

はい、私は戻ってTにキャストしなければならなかったが、。それは働いた。ありがとうございました。あなたは私のコードをもっときれいにしました:o) – Morten

関連する問題