Using an anonymous delegate to return an object

6.6k views Asked by At

Is it possible to use an anonymous delegate to return an object?

Something like so:

object b = delegate { return a; };
3

There are 3 answers

3
Marc Gravell On BEST ANSWER

Yes, but only by invoking it:

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

And of course, the following is a lot simpler...

object b = a;

In the comments, cross-thread exceptions are mentioned; this can be fixed as follows:

If the delegate is the thing we want to run back on the UI thread from a BG thread:

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

Or the other way around (to run the delegate on a BG):

object value = someControl.Value;
ThreadPool.QueueUserWorkItem(delegate {
    // can talk safely to "value", but not to someControl
});
0
thinker3 On
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"));
    }
}
0
Basil On

Just declare somewhere these static functions:

public delegate object AnonymousDelegate();

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

And anywhere use it as you want like this:

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

or even like this

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