2010-01-17 29 views
1

我试图从Django(http://docs.djangoproject.com/en/dev/topics/signals/),或其概念在C#中实现的信号,以减少/消除耦合/方法的依赖关系。我如何实现信号(从Django)概念在C#

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

然后我意识到委托人有一个独特的签名,所以我不能真正混合委托方法(与diff签名)到一个列表,或者我可以吗?

我做了更多的搜索,并找到了反应性LINQ,到目前为止,linq看起来很棒,但我仍然没有真正了解何时使用它们。

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

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

干杯:)

+5

您是否熟悉C#的“events”概念?我认为这将完成你想要的东西,而且它是本地语言。 :) http://msdn.microsoft.com/en-us/library/aa645739(VS.71).aspx – Sapph 2010-01-17 09:25:28

+0

同意上面Sapph的评论。查看构建自EventArgs派生的自定义类,以便将不同类型的数据从发件人传输到接收方(如示例代码中所示):http://msdn.microsoft.com/en-us/library/system.eventargs(VS .85).aspx – BillW 2010-01-17 09:39:44

+0

也想一想:http://msdn.microsoft.com/en-us/library/w369ty8x.aspx“如何发布事件”是一篇非常有用的文章,向您展示了使用定义事件的通用和非通用方法。 – BillW 2010-01-17 10:31:18

回答

2

你在说什么这里是在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(...); 

但由于委托实例是组播这可能是多余的 - 这样你就可以做到这一点更直接:

Action action = null; 
action += delegate { Console.WriteLine("Did A");}; 
action += delegate { Console.WriteLine("Did B");}; 
action(); // does both A & B 

需要注意的是更为复杂的委托使用率可能involv传入的参数值 - 例如:

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

通过将诸如匿名方法(或lambda,如上所述)与诸如捕获变量之类的东西结合起来,签名必须匹配的问题很少成为问题 - 您可以用一个包装lambda进行签名匹配(根据需要添加额外的值或删除参数)。

注意与事件(具体地)常用的方法是保持签名:

void SomeDelegateType(object sender, SomeArgsType args); 

其中SomeArgsType : EventArgs - 或使用EventHandler<T>这会为你做到这一点。

+0

这是一个很好的答案! – 2016-12-31 09:12:14