2011-11-28 17 views
6

He creado el vacío sanitario de muestreo Código:Conseguir objetivo de Acción

class Program { 
    static void Main(string[] args) { 
     var x = new ActionTestClass(); 
     x.ActionTest(); 
     var y = x.Act.Target; 
    } 
} 

public class ActionTestClass { 
    public Action Act; 
    public void ActionTest() { 
     this.Act = new Action(this.ActionMethod); 
    } 

    private void ActionMethod() { 
     MessageBox.Show("This is a test."); 
    } 
} 

Cuando hago esto de esta manera, y lo hará un objeto de tipo ActionTestClass (que se creó para x). Ahora, cuando cambio la línea

this.Act = new Action(this.ActionMethod); 

a

this.Act = new Action(() => MessageBox.Show("This is a test.")); 

y (el destino de la acción) será nulo. ¿Hay alguna forma de que pueda obtener el objetivo (en la muestra, el objeto ActionTestClass) también en la forma en que uso una acción anónima?

+0

Personalmente, no me sorprende que 'Action' no sepa nada sobre el 'ActionTestClass' que se refiere a eso. ¿Por qué lo haría? – AakashM

+0

@AakashM: en el primer ejemplo está vinculando a un método de instancia, por lo que 'Target' no debe ser nulo. Sin embargo, esto podría no fallar debido a que no se usan variables de instancia. No creo que puedas vincularlo sin un 'Target' usando un constructor delegado. – leppie

+0

@leppie lo siento, quería decir el segundo ejemplo: a diferencia del primer ejemplo, para la segunda "Acción" está claro por inspección que no tiene nada que ver con ningún objeto en particular, así que no estoy del todo sorprendido de que sea 'es' nulo'. ¿Debería estar esperando algo más? – AakashM

Respuesta

1

La falta de Target (OIA == null) implica que el delegado o bien llamar a un método static o ningún medio ambiente ha sido capturado (OIA no un cierre, sólo un 'puntero de función').

+1

Ejercicio para el lector: Comprenda por qué los cierres son las clases de los pobres con respecto a la respuesta anterior. – leppie

0

Usted puede usar la siguiente:

Act.Method.DeclaringType 
+0

¿Qué variables crees que están siendo capturadas en el segundo ejemplo? – leppie

+0

Ninguno, estaba diciendo cómo el compilador crea cierres en general. –

+0

Eso realmente no aborda la pregunta de ninguna manera, entonces .../o \ – leppie

0

la razón por la que se ve la meta lo más vacío es porque el método anónimo no es parte de ninguna clase. Si abre su programa en reflector, le mostrará el código generado por el compilador, aquí verá el siguiente

public void ActionTest() 
    { 
     this.Act = delegate { 
      Console.WriteLine("This is a test."); 
     }; 
    } 
Cuestiones relacionadas