2011-03-09 111 views
2

我試圖通過引入泛型來重構一些代碼,並且卡住了。我試圖創建一個新的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

的問題是,編譯器不知道你要轉換您的方法組,其代表。如果是總是DoStuffDelegate,你可以這樣做:

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不同,它很難 - 你可能需要調用Delegate.CreateDelegate創建適當的委託類型的實例,通過反射發現:(

+0

我認爲'Activator.CreateInstance'在這種情況下返回一個對象嗎?一個'as'強制類型或通用版本應該是應用。 – 2011-03-09 09:49:34

+0

@Danny:是的,演員將是必需的 - 將加入英寸我是專注於事物的爭論方面,我認爲這是OP的原始問題:) – 2011-03-09 09:50:26

+0

是的,我不得不把它回到T,但那麼它的工作。謝謝。你只是讓我的代碼更漂亮:o) – Morten 2011-03-09 09:53:48