2011-03-09 84 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