Puedo obtener la llamada a la instancia desde dentro de un método a través de la reflexión/diagnóstico?

StackOverflow https://stackoverflow.com/questions/97193

  •  01-07-2019
  •  | 
  •  

Pregunta

Es allí una manera a través del Sistema.La Reflexión, El Sistema.De diagnóstico o de otro para obtener una referencia a la instancia real que está llamando a un método estático sin pasar en el método en sí?

Por ejemplo, algo a lo largo de estas líneas

class A
{
    public void DoSomething()
    {
        StaticClass.ExecuteMethod();
    }
}

class B
{
    public void DoSomething()
    {
        SomeOtherClass.ExecuteMethod();
    }
}
public class SomeOtherClass
{
    public static void ExecuteMethod()
    {
        // Returns an instance of A if called from class A
        // or an instance of B if called from class B.
        object caller = getCallingInstance();
    }
}

Puedo conseguir el tipo de uso Sistema.Los diagnósticos.StackTrace.GetFrames, pero hay una manera de obtener una referencia a la instancia real?

Soy consciente de los problemas relacionados con la reflexión y el rendimiento, así como estático estático llamadas, y que esto es en general, tal vez incluso casi univerally, no es la forma correcta de acercarse a este.Parte de la razón de esta pregunta es que tenía curiosidad por ver si era factible;actualmente estamos pasando la instancia en.

ExecuteMethod(instance)

Y sólo me preguntaba si esto era posible y aún así ser capaz de acceder a la instancia.

ExecuteMethod()

@Steve Cooper:No había considerado que los métodos de extensión.Algunos variación de que podría funcionar.

¿Fue útil?

Solución

No creo que pueda.Incluso el StackTrace y StackFrame clases sólo te dan la información de nombres, no el acceso a las instancias.

No estoy seguro exactamente por qué quieres hacer esto, pero sé que incluso si podía hacerlo es probable que sea muy lento.

Una solución mejor sería promover la instancia a un hilo contexto local antes de llamar a Execute que puede recuperar dentro de ella o simplemente pase a la instancia.

Otros consejos

Considere la posibilidad de hacer el método un método de extensión.Definir como:

public static StaticExecute(this object instance)
{
    // Reference to 'instance'
}

Es llamada así:

this.StaticExecute();

No puedo pensar en una manera de hacer lo que quieres hacer de forma directa, pero sólo puedo sugerir que si encuentras algo, te cuides de los métodos estáticos, que no tiene uno, y los métodos anónimos, que tendrán instancias de las clases auto-generadas, que será un poco extraño.

Me pregunto si debería pasar el objeto invocante como un parámetro adecuado.Después de todo, un static es un indicio de que este método no depende de otra cosa que de sus parámetros de entrada.También tenga en cuenta que este método puede ser una perra a la prueba, como cualquier prueba de código que se escribe no tienen el mismo objeto invocante, como el sistema en ejecución.

En el caso de un método estático llamado a su método estático, no hay ninguna llamada de la instancia.

Encontrar una manera diferente para lograr lo que usted está tratando de hacer.

Sólo tienes Execute tomar un objeto.Entonces usted tiene la instancia no importa qué.

Me siento como que me falta algo, aquí.El método estático puede ser llamado desde cualquier punto.No hay ninguna garantía de que un clase a o clase B, instancia que aparecen en cualquier lugar de la pila de llamadas.

Tiene que haber una mejor manera de llevar a cabo lo que estamos tratando de hacer.

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