使用委托arg创建通用实例

时间:2011-03-09 09:41:02

标签: c# .net generics delegates

我试图通过引入泛型来重构一些代码,但我陷入困境。我试图创建一个新的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(); 
    }
}

但是,这不起作用,因为在 [Activator] 中只允许 [object] 类型作为参数。我不被允许更改构造函数,因此无法将代理移动到其他位置。

有没有出路,或者仿制药不是这里的选择?

此致 的Morten

1 个答案:

答案 0 :(得分: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来创建通过反射发现的相应委托类型的实例:(