Pergunta

Eu quero chamar métodos com um determinado atributo. Então, eu estou ciclismo através de todas as igrejas e todos os métodos para encontrar os métodos com meu atributo. Funciona bem, mas como faço para chamar um determinado método quando eu só tenho ele de MethodInfo.

AppDomain app = AppDomain.CurrentDomain;
Assembly[] ass = app.GetAssemblies();
Type[] types;
foreach (Assembly a in ass)
{
    types = a.GetTypes();
    foreach (Type t in types)
    {
        MethodInfo[] methods = t.GetMethods();
        foreach (MethodInfo method in methods)
        {
            // Invoke a certain method
        }
    }
}

O problema é que eu não sei a instância da classe que contém o determinado método. Então eu não posso chamá-lo corretamente porque os métodos não são estáticos. Eu também quero evitar a criação de uma nova instância dessa classe, se possível.

Foi útil?

Solução

Isso me parece um problema em termos de definição do problema, em vez de codificação.

Métodos de instância depender de qual instância que for chamado - não faz sentido chamar um método de instância sem se preocupar com o que é chamado por diante. (Como diz Martin, um método de instância que não se importa qual instância ele está sendo chamado deve ser quase sempre estática. A única exceção imediato que eu posso pensar para isso é métodos virtuais, onde a instância implicitamente especifica quais implementação para uso.)

Trabalho com o que ele realmente através em seu contexto para que haja um método de instância anotada. Por que você está tentando chamar métodos de qualquer maneira? Qual é a foto maior? Que contexto você tem? Eu suspeito fortemente que você vai querer alguma noção de um contexto -. Uma coleção de objetos que você pode chamar os métodos de instância na

Outras dicas

Os métodos não-estáticos são instância específica para que você deve instanciar a classe para chamar o método. Se você tem a capacidade de alterar o código onde ele está definido eo método não requer-se para ser parte de uma instância (não faz o acesso ou modificar quaisquer propriedades não-estáticos ou métodos dentro da classe), então a melhor prática seria ser para fazer o método estático de qualquer maneira.

Assumindo que você não pode torná-lo estático, então o código que você precisa é o seguinte:

    foreach (Type t in types)
    {
            object instance = Activator.CreateInstance(t);

            MethodInfo[] methods = t.GetMethods();
            foreach (MethodInfo method in methods)
            {                    
                method.Invoke(instance, params...);    
            }
    }

Na verdade, eu acho que o que você precisa fazer é criar uma lista dos objetos existentes e, em seguida, procurar a lista. Então, como você criar esses objetos invokable, você armazená-los na lista (ou, talvez, a lista deve ser uma lista de objetos de algum outro tipo, que também tem uma descrição do objeto invokable). Depois, você pode verificar a lista em tempo de execução, encontrar aquele que combina com o tipo de evento que você está segurando, e depois olhar para cima sua MethodInfo e chamar .Invoke na informação método, assumindo que é o que você quer fazer. Você também precisa passar os argumentos apropriados, mas você pode fazer isso através da criação de um vetor de objetos dos tipos de direito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top