2011-02-06 7 views
5

¿Es posible usar un delegado anónimo para devolver un objeto?Usar un delegado anónimo para devolver un objeto

Algo así:

object b = delegate { return a; }; 
+1

dónde viene 'a' viene? Además, su código existente simplemente asigna 'b' al delegado mismo. – BoltClock

+0

@BoltClock - gracias por señalar el problema de asignación. – wulfgarpro

+0

ver la actualización de su dolor cruzado –

Respuesta

9

Sí, pero sólo mediante la invocación que:

Func<object> func = delegate { return a; }; 
// or Func<object> func =() => a; 
object b = func(); 

Y, por supuesto, la siguiente es mucho más simple ...

object b = a; 

En los comentarios, las excepciones cruzadas son mencionado; esto se puede solucionar de la siguiente manera:

Si el delegado es lo que queremos ejecutar de nuevo el hilo de interfaz de usuario de un hilo BG:

object o = null; 
MethodInvoker mi = delegate { 
    o = someControl.Value; // runs on UI 
}; 
someControl.Invoke(mi); 
// now read o 

O al revés (para ejecutar el delegado en un BG):

object value = someControl.Value; 
ThreadPool.QueueUserWorkItem(delegate { 
    // can talk safely to "value", but not to someControl 
}); 
+0

y si estoy tratando de comparar 'a' con algún otro objeto dentro de un método en un hilo que no sea el hilo en el que' a' pertenece? Por ejemplo, 'void Test() {if (a == b) {}}' donde acceder a b desde este método causa una excepción de hilos cruzados. – wulfgarpro

+0

@Wulfgar 'a' no" pertenece "a un hilo; pertenece a una instancia de clase (si es un campo), o es una variable de método. De cualquier manera, el compilador "capturará" la variable 'a' del alcance que declara el delegado; creando un tipo que encapsula la instancia del objeto "this" (para un campo), o la "variable" misma; citado porque luego * se convierte * en un campo. –

+0

@Wulfgar: para obtener un hilo conductor, debe hacer el trabajo de la interfaz de usuario; sí, puede arreglar esto, pero "cómo" depende de qué bloque de código es el código de UI; ¿Puedes aclarar eso por favor? –

1

Sólo declaran algún lugar estas funciones estáticas:

public delegate object AnonymousDelegate(); 

public static object GetDelegateResult(AnonymousDelegate function) 
{ 
    return function.Invoke(); 
} 

y en cualquier lugar lo utilizan como desea así:

object item = GetDelegateResult(delegate { return "TEST"; }); 

ni aun como este

object item = ((AnonymousDelegate)delegate { return "TEST"; }).Invoke(); 
0
using System; 

public delegate int ReturnedDelegate(string s); 

class AnonymousDelegate 
{ 
    static void Main() 
    { 
     ReturnedDelegate len = delegate(string s) 
     { 
      return s.Length; 
     }; 
     Console.WriteLine(len("hello world")); 
    } 
} 
Cuestiones relacionadas