Использование анонимного делегата для возврата объекта - PullRequest
5 голосов
/ 06 февраля 2011

Можно ли использовать анонимный делегат для возврата объекта?

Примерно так:

object b = delegate { return a; };

Ответы [ 3 ]

9 голосов
/ 06 февраля 2011

Да, но только вызывая его:

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

И, конечно, следующее намного проще ...

object b = a;

В комментариях скрестите- упоминаются исключения из множества тем;это можно исправить следующим образом:

Если делегат - это то, что мы хотим запустить в потоке пользовательского интерфейса из потока BG:

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

Илинаоборот (для запуска делегата на BG):

object value = someControl.Value;
ThreadPool.QueueUserWorkItem(delegate {
    // can talk safely to "value", but not to someControl
});
1 голос
/ 15 июня 2011

Просто объявите где-нибудь эти статические функции:

public delegate object AnonymousDelegate();

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

И везде используйте его так, как вы хотите, вот так:

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

или даже так

object item = ((AnonymousDelegate)delegate { return "TEST"; }).Invoke();
0 голосов
/ 20 января 2015
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"));
    }
}
...