Pregunta

Quiero invocar métodos con un determinado atributo. Así que estoy en bicicleta por todas las iglesias y todos los métodos para encontrar los métodos con mi atributo. Trabaja muy bien, pero ¿cómo puedo invocar un método determinado cuando sólo consiguió es 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
        }
    }
}

El problema es que no sé la instancia de la clase que contiene ese método determinado. Por lo tanto, no puede invocar de forma adecuada debido a que los métodos no son estáticas. También quiero evitar la creación de una nueva instancia de esta clase, si es posible.

¿Fue útil?

Solución

Esto me parece un problema en cuanto a la definición del problema en lugar de la codificación.

Los métodos de instancia dependen de qué instancia se les llama en - que no tiene sentido llamar a un método de instancia sin preocuparse de lo que se llama sucesivamente. (Como dice Martin, un método de instancia que no importa qué instancia está siendo llamado a debe casi siempre ser estática. La única excepción inmediata que se me ocurre para esto es los métodos virtuales, en los que la instancia especifica de forma implícita, que la implementación de usar.)

trabajar en lo que realmente medios en su contexto para que haya un método de instancia anotada. ¿Por qué estás tratando de llamar a los métodos de todos modos? ¿Cuál es la imagen más grande? Qué contexto tiene usted? Tengo la firme sospecha que querrá alguna noción de un contexto -. Una colección de objetos que puede llamar a los métodos de instancia en

Otros consejos

Los métodos no son estáticas instancia específica por lo que debe crear una instancia de la clase para invocar el método. Si usted tiene la capacidad de cambiar el código en el que se define y el método no requiere a sí misma como parte de una instancia (que no tiene acceso o modificar las propiedades o métodos no estáticos dentro de la clase), entonces sería la mejor práctica ser que el método estático de todos modos.

Suponiendo que no puede hacer que sea estática entonces el código que necesita es la siguiente:

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

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

En realidad, creo que lo que hay que hacer es crear una lista de los objetos existentes y luego buscar en la lista. Así que a medida que crea estos objetos invocable, que le almacenarlos en la lista (o tal vez la lista debe ser una lista de objetos de algún otro tipo, que también tiene una descripción del objeto invocable). A continuación, puede escanear la lista en tiempo de ejecución, encontrar el que coincida con el tipo de evento que está manejando, y luego buscar su MethodInfo y llame .Invoke en la información método, suponiendo que eso es lo que quiere hacer. También tendría que pasar en los argumentos adecuados, pero se puede hacer que mediante la creación de un vector de objetos de los tipos adecuados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top