我试图通过引入泛型来重构一些代码,但我陷入困境。我试图创建一个新的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
答案 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
来创建通过反射发现的相应委托类型的实例:(