Pergunta

Eu quero criar uma lista de métodos para executar. Cada método tem a mesma assinatura. Eu pensei sobre a colocação de delegados em uma coleção genérica, mas eu continuo recebendo este erro:

'método' é uma 'variável' mas é usado como um 'método'

Em teoria, aqui é o que eu gostaria de fazer:

List<object> methodsToExecute;

int Add(int x, int y)
{ return x+y; }

int Subtract(int x, int y)
{ return x-y; }

delegate int BinaryOp(int x, int y);

methodsToExecute.add(new BinaryOp(add));
methodsToExecute.add(new BinaryOp(subtract));

foreach(object method in methodsToExecute)
{
    method(1,2);
}

Algumas ideias sobre como fazer isso? Obrigado!

Foi útil?

Solução

Você precisa lançar o object na lista para um BinaryOp, ou, melhor, use um parâmetro de tipo mais específico para a lista:

delegate int BinaryOp(int x, int y);

List<BinaryOp> methodsToExecute = new List<BinaryOp>();

methodsToExecute.add(Add);
methodsToExecute.add(Subtract);

foreach(BinaryOp method in methodsToExecute)
{
    method(1,2);
}

Outras dicas

Usando .NET 3.0 (ou 3.5?), Você tem representantes genéricos.

Tente isto:

List<Func<int, int, int>> methodsToExecute = new List<Func<int, int, int>>();

methodsToExecute.Add(Subtract);

methodsToExecute.Add[0](1,2); // equivalent to Subtract(1,2)
List<Func<int, int, int>> n = new List<Func<int, int, int>>();
            n.Add((x, y) => x + y);
            n.Add((x, y) => x - y);
            n.ForEach(f => f.Invoke(1, 2));

Eu gosto de implementação do Khoth melhor, mas eu acho que o que está causando o seu erro do compilador é que você não lançam método para a BinaryOp antes de tentar invocá-lo. Em seu loop foreach é apenas um "objeto". Mude sua foreach para olhar como Khoth de e eu acho que ele iria trabalhar.

Sempre que eu ter sido tentado a fazer algo assim, eu descobri que é geralmente melhor refatorar seu projeto para usar o padrão de comando, especialmente desde que todos os seus métodos têm os mesmos parâmetros. Desta forma, permite muito mais flexibilidade.

não tentei isso, mas usando um tipo List > deve ser capaz de fazê-lo.

tê-los todos implementar de interface comum, dizem IExecuteable, e depois ter uma List

Além disso, usando delegados:

class Example
{
    public delegate int AddDelegate(int x, int y);

    public List<AddDelegate> methods = new List<AddDelegate>();

    int Execute()
    {
        int sum = 0;
        foreach(AddDelegate method in methods)
        {
            sum+=method.Invoke(1, 2);
        }
        return sum;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top