Domanda

Voglio richiamare i metodi con un determinato attributo. Così sto in bicicletta attraverso tutte le assemblee e tutti i metodi per trovare i metodi con il mio attributo. Funziona bene, ma come faccio a invoco un certo metodo quando ho ottenuto solo che è 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
        }
    }
}

Il problema è che non so l'istanza della classe che contiene quel certo metodo. Quindi non posso invoco in modo corretto perché i metodi non sono statici. Voglio anche evitare di creare una nuova istanza di questa classe, se possibile.

È stato utile?

Soluzione

Questo mi sembra un problema in termini di definizione del problema, piuttosto che codifica.

I metodi di istanza dipendono da quale esempio si chiamano in - non ha senso per chiamare un metodo di istanza, senza preoccuparsi di come si chiama via. (Come dice Martin, un metodo di istanza, che non si cura l'istanza è in fase di chiamata sul dovrebbe quasi sempre essere statico. L'unica eccezione immediato mi viene in mente per questo è metodi virtuali, in cui l'istanza specifica implicitamente quale implementazione da utilizzare.)

capire cosa davvero mezzi nel vostro contesto per esista un metodo di istanza annotato. Perché si sta tentando di richiamare i metodi comunque? Qual è il quadro più ampio? Cosa contesto avete? Ho il forte sospetto si vorrà qualche nozione di un contesto -. Una collezione di oggetti che si possono chiamare i metodi di istanza sul

Altri suggerimenti

I metodi non statici sono un'istanza specifica quindi è necessario creare un'istanza della classe per invocare il metodo. Se si ha la possibilità di modificare il codice in cui è definito e il metodo non richiede stessa per essere parte di un'istanza (non accedere o modificare le proprietà non statici o metodi all'interno della classe) quindi migliore pratica sarebbe essere quello di rendere il metodo statico in ogni caso.

Supponendo che non si può rendere statico, allora il codice necessario è il seguente:

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

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

In realtà, penso che quello che dovete fare è quello di creare un elenco degli oggetti esistenti e quindi cercare l'elenco. Quindi, come si creano questi oggetti invokable, li si dovrebbe memorizzare nella lista (o forse la lista dovrebbe essere un elenco di oggetti di qualche altro tipo che ha anche una descrizione dell'oggetto richiamabile). Quindi è possibile scorrere la lista in fase di esecuzione, trovare quello che corrisponde al tipo di evento che si sta gestendo, e poi guardare il suo MethodInfo e chiamare .Invoke sul metodo di informazioni, assumendo che è ciò che si vuole fare. Si sarebbe anche bisogno di passare gli argomenti appropriati, ma si può fare con la creazione di un vettore di oggetti dei tipi giusti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top