Создать общий экземпляр с делегатом arg - PullRequest
2 голосов
/ 09 марта 2011

Я пытаюсь реорганизовать некоторый код, введя дженерики, и я застрял. Я пытаюсь создать новый экземпляр 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(); 
    }
}

Однако, это не работает, так как только [объект] типы разрешены в качестве аргументов в [Активатор] . Мне не разрешено изменять конструктор, поэтому перемещение делегата в другое место невозможно.

Есть ли выход, или дженерики здесь не вариант?

С уважением, Morten

1 Ответ

3 голосов
/ 09 марта 2011

Проблема в том, что компилятор не знает, к какому делегату вы хотите преобразовать группу методов. Если это всегда 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, чтобы создать экземпляр соответствующего типа делегата, обнаруженный с помощью отражения: (*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...