C# 如何在C中实现信号(来自Django)概念#

C# 如何在C中实现信号(来自Django)概念#,c#,django,C#,Django,我试图实现来自Django()的信号,或者它在C#中的概念,以减少/消除耦合/方法依赖性 到目前为止,我正在很好地复制代码,直到我意识到方法在C#中不像在Python中那样是对象。然后我想到了指针,然后我意识到我不能有指向方法的指针。它的C#版本是代表 然后我意识到委托有一个唯一的签名,所以我不能将委托方法(带有差异签名)混合到一个列表中,或者我可以吗 我在谷歌上搜索了一下,发现了反应式LINQ,到目前为止,LINQ看起来棒极了,但我还是不知道什么时候使用它们 所以我的问题是,如何在C#中实现信

我试图实现来自Django()的信号,或者它在C#中的概念,以减少/消除耦合/方法依赖性

到目前为止,我正在很好地复制代码,直到我意识到方法在C#中不像在Python中那样是对象。然后我想到了指针,然后我意识到我不能有指向方法的指针。它的C#版本是代表

然后我意识到委托有一个唯一的签名,所以我不能将委托方法(带有差异签名)混合到一个列表中,或者我可以吗

我在谷歌上搜索了一下,发现了反应式LINQ,到目前为止,LINQ看起来棒极了,但我还是不知道什么时候使用它们

所以我的问题是,如何在C#中实现信号的概念?谢谢

哦,我有没有提到我是C#的新成员(1天大)?我确实有各种其他语言的背景,包括Java/C/Python


干杯:)

例如,你在这里谈论的内容通常在C#中作为事件处理

public class SomeType {
    public event EventHandler SomeEvent;
    protected virtual void OnSomeEvent() {
        EventHandler handler = SomeEvent;
        if(handler!=null) handler(this,EventArgs.Empty);
    }
    public void SomethingInteresting() {
        // blah
        OnSomeEvent(); // notify subscribers
        // blap
    }
    // ...
}
与订户

SomeType obj = new SomeType();
//...
obj.SomeEvent += /* some handler */
//...
处理程序可以是一个方法,但在您讨论签名等时,将现有方法与不匹配的签名重新使用的常见方法是匿名方法:

obj.SomeEvent += delegate { this.Text = "Done!"; };
您可以有一个代理列表:

List<SomeDelegateType> list = new List<SomeDelegateType>();
list.Add(...);
请注意,更复杂的委托用法可能涉及传入参数值-例如:

int i = 24;
Func<int,int,int> func = (x,y) => (x * i) + y;
int result = func(2, 3); // 51

where
someargs键入:EventArgs
-或使用
EventHandler
,这将为您完成此操作。

您熟悉“事件”的C#概念吗?我认为这将完全满足您的要求,而且它是该语言的母语。:)同意Sapph的上述评论。查看构建从EventArgs派生的自定义类,以将不同类型的数据从发送者传输到接收者,如这里的示例代码所示:还可以这样想:“How to Publish Events”是一篇非常有用的文章,它向您展示了使用泛型和非泛型方法定义事件的非常清晰的示例。这是一个很好的答案!
int i = 24;
Func<int,int,int> func = (x,y) => (x * i) + y;
int result = func(2, 3); // 51
void SomeDelegateType(object sender, SomeArgsType args);