C# 使用匿名委托返回对象

C# 使用匿名委托返回对象,c#,delegates,language-features,C#,Delegates,Language Features,是否可以使用匿名委托返回对象 大概是这样的: object b = delegate { return a; }; 是的,但只能通过调用它: Func<object> func = delegate { return a; }; // or Func<object> func = () => a; object b = func(); 评论中提到了跨线程的例外情况;这可以通过以下方式进行修复: 如果委托是我们希望从BG线程在UI线程上运行的对象: object

是否可以使用匿名委托返回对象

大概是这样的:

object b = delegate { return a; };

是的,但只能通过调用它:

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

评论中提到了跨线程的例外情况;这可以通过以下方式进行修复:

如果委托是我们希望从BG线程在UI线程上运行的对象:

object o = null;
MethodInvoker mi = delegate {
    o = someControl.Value; // runs on UI
};
someControl.Invoke(mi);
// now read o
或者反过来(在BG上运行代理):


只需在某个地方声明这些静态函数:

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();

a
来自哪里?另外,您现有的代码只是将
b
分配给代理本身。@BoltClock-感谢您指出分配问题。请参阅更新,了解您的跨线程问题。如果我试图将
a
a
所属线程以外的线程上方法中的其他对象进行比较,请参阅?例如,
void Test(){if(a==b){}
从该方法访问b会导致跨线程异常。@Wulfgar
a
不“属于”线程;它要么属于类实例(如果是字段),要么属于方法变量。无论哪种方式,编译器都将从声明委托的作用域中“捕获”变量
a
;通过创建封装对象实例“this”(对于字段)或“variable”本身的类型;引用,因为它会变成一个字段。@Wulfgar-要获得一个交叉线程,您必须进行UI工作;是的,您可以解决这个问题,但是“如何”取决于哪个代码块是UI代码;你能澄清一下吗?
object item = GetDelegateResult(delegate { return "TEST"; });
object item = ((AnonymousDelegate)delegate { return "TEST"; }).Invoke();
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"));
    }
}