Como faço para criar um dicionário onde posso armazenar funções?
Obrigado.
Tenho cerca de 30 funções que podem ser executadas pelo usuário. Eu quero ser capaz de executar a função desta forma:
private void functionName(arg1, arg2, arg3)
{
// code
}
dictionaryName.add("doSomething", functionName);
private void interceptCommand(string command)
{
foreach ( var cmd in dictionaryName )
{
if ( cmd.Key.Equals(command) )
{
cmd.Value.Invoke();
}
}
}
No entanto, a assinatura da função nem sempre é a mesma, tendo, portanto, diferentes quantidades de argumentos.
Respostas:
Como isso:
Isso permite que você armazene funções que recebem um parâmetro de string e retornam booleano.
Ou se a função não for anônima:
onde Foo é definido assim:
ATUALIZAR:
Depois de ver sua atualização, parece que você não sabe com antecedência a assinatura da função que deseja invocar. No .NET para invocar uma função, você precisa passar todos os argumentos e se você não sabe quais são os argumentos, a única maneira de conseguir isso é através da reflexão.
E aqui está outra alternativa:
Com essa abordagem, você ainda precisa saber o número e o tipo de parâmetros que precisam ser passados para cada função no índice correspondente do dicionário ou obterá um erro de execução. E se suas funções não tiverem valores de retorno, use em
System.Action<>
vez deSystem.Func<>
.fonte
Dictionary<int, Delegate>
.Vamos começar com algumas funções definidas assim:
Você realmente tem 2 opções viáveis à sua disposição:
1) Mantenha a segurança de tipo fazendo com que os clientes chamem sua função diretamente.
Esta é provavelmente a melhor solução, a menos que você tenha muito boas razões para quebrar a partir deste modelo.
Quando você fala sobre como interceptar chamadas de função, parece-me que você está tentando reinventar funções virtuais. Existem várias maneiras de tirar esse tipo de funcionalidade da caixa, como herdar de uma classe base e substituir suas funções.
Parece-me que você quer uma classe que seja mais um wrapper do que uma instância derivada de uma classe base, então faça algo assim:
2) OU mapeie a entrada de suas funções para uma interface comum.
Isso pode funcionar se todas as suas funções estiverem relacionadas. Por exemplo, se você está escrevendo um jogo e todas as funções fazem algo para alguma parte do jogador ou inventário do jogador. Você acabaria com algo assim:
fonte
object
semelhante àquela que seria passada para um novo Thread.Ei, espero que isso ajude. De qual idioma você vem?
fonte
Por que não usar
params object[] list
para parâmetros de método e fazer alguma validação dentro de seus métodos (ou lógica de chamada), isso permitirá um número variável de parâmetros.fonte
O cenário a seguir permite que você use um dicionário de elementos para enviar como parâmetros de entrada e obter o mesmo que os parâmetros de saída.
Primeiro, adicione a seguinte linha no topo:
Então, dentro de sua classe, defina o dicionário da seguinte maneira:
Isso permitiria que você execute essas funções anônimas com uma sintaxe semelhante a esta:
fonte
Defina o dicionário e adicione a referência da função como o valor, usando
System.Action
como o tipo:Em seguida, invoque-o com:
fonte