如何将相同的事件分配给不同的对象?

时间:2014-07-05 09:42:27

标签: c# events

我正在使用具有OnData事件的组件。我想用几乎相同的OnData事件从这个组件创建100个对象。

我的代码是这样的:

        Tcp[] arrTcp = new Tcp[100];

        for(int i=0; i<100; i++)
        {
            arrTcp[i] = new Tcp();

            arrTcp[i].Data += tcp1_Data;
        }

但OnData事件在每个tcp对象中都有点不同。

    void tcp1_Data(object sender, Dart.Sockets.DataEventArgs e)
    {

        // all code are same except this part :

        if(tcp1)
            Console.WriteLine("tcp1");

        if(tcp2)
            Console.WriteLine("tcp2");

        .....
    }

我不想写100个事件......任何想法?

获取更多信息:tcp1_Data将通过多线程触发...

1 个答案:

答案 0 :(得分:3)

我会做这样的事情:

var arrTcp = new Tcp[100];

var specificCode = new Dictionary<int, Action<int, Tcp>>()
{
    { 0, (index, tcp) => Console.WriteLine("tcp1") },
    { 1, (index, tcp) => Console.WriteLine("tcp2") },
    // ...
    { 99, (index, tcp) => Console.WriteLine("tcp100") },
};

for (var i = 0; i < 100; i++)
{
    arrTcp[i] = new Tcp();

    var index = i;
    arrTcp[i].Data += (s, e) =>
    {
        // all code are same except for :
        specificCode[index](index, arrTcp[index]);
    };
}

现在,这不是一个很大的改进,除了它可能使代码稍微更易于维护。但是,根据specificCode字典中代码的复杂性,这可能会更糟糕。

我怀疑你在这里试图解决的问题实际上并不是为每个事件处理程序编写自定义代码。我想你可能有一个潜在的问题,你认为可以通过这种方式解决。如果您可以根据您的潜在需求发布另一个问题,我认为我们可以为您提供更多帮助。