【问题标题】:Call methods of a collection of interfaces with a single call通过一次调用调用接口集合的方法
【发布时间】:2015-02-21 00:09:57
【问题描述】:

所以我有以下内容:

public interface Client
{
    void Operation1();
    void Operation2();
}

public class Client1 : Client
{
    public void Operation1()
    {
        Console.WriteLine("Client1 - Operation1");
    }

    public void Operation2()
    {
        Console.WriteLine("Client1 - Operation2");
    }
}

public class Client2 : Client
{
    public void Operation1()
    {
        Console.WriteLine("Client2 - Operation1");
    }

    public void Operation2()
    {
        Console.WriteLine("Client2 - Operation2");
    }
}

public class Client3 : Client
{
    public void Operation1()
    {
        Console.WriteLine("Client3 - Operation1");
    }

    public void Operation2()
    {
        Console.WriteLine("Client3 - Operation2");
    }
}

我需要一种方法来一次调用所有客户端的方法。类似于委托的东西。

基本上我想做以下事情: Clients.Operation1() 哪个输出: 客户 1 - 操作 1 客户 2 - 操作 1 客户端 3 - 操作 1

实现这一点的一种方法是使用以下类:

public class Clients : Client
{
    public List<Client> Clients { get; set; }
    public void Operation1()
    {
        foreach(Client c in Clients)
        {
            c.Operation1();
        }
    }
    public void Operation2()
    {
        foreach (Client c in Clients)
        {
            c.Operation2();
        }
    }
}

但是每当我更改客户端接口时,我也必须更改客户端类。 有没有办法动态生成 Clients 类(或类似的东西)?

如果您需要更好的解释,请告诉我,因为我很难解释这个问题。

【问题讨论】:

  • 我明白了。看来您所拥有的一切都很好,并且有一个名称Composite pattern。在修改其他客户端类时,为什么不能花很少的时间在 Clients 类中添加一个方法?
  • 一般来说界面保证你的代码不会改变。为了解决这个问题,您可以使用一种方法,将 Func 参数与您要调用的方法一起使用,并且您不必在 Clients 类中实现 Client 接口
  • @SriramSakthivel 因为我真的很固执,如果我只是花时间在那个类中添加一个方法,我不会学到任何东西。

标签: c# class dynamic interface


【解决方案1】:

您可以简单地实现一个方法Execute 并将您要执行的方法传递给它:

public class Clients
{
    public List<Client> ClientList { get; set; }

    public void Execute(Action<Client> action)
    {
        ClientList.ForEach(action);
    }

}

用法:

new Clients().Execute(x => x.Operation1(someString, someInt));
new Clients().Execute(x => x.Operation2());

使用此示例,您不必在 Clients 类中实现接口,也不必在每次接口更改时重新掌握它。

【讨论】:

  • 不过还有一个问题:我该如何处理这些参数?有些方法确实需要参数。例如,Operation1 可能采用字符串,而 Operation2 没有参数。我将如何相应地通过这些?
  • 你只需在调用函数中传递参数,我已经更新了答案
  • 只是不要忘记小心这些参数,因为你要把它们带入clojure,所以我建议你阅读一下这个主题
猜你喜欢
  • 1970-01-01
  • 2013-09-18
  • 2022-01-23
  • 2018-09-15
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多