通过单个调用调用接口集合的方法

Pho*_*nix 3 c# interface class dynamic

所以我有以下内容:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要一种方法来通过一次调用来调用所有客户端的方法.像代表一样的东西.

基本上我想做以下事情:Clients.Operation1()哪个输出:Client1 - Operation1 Client2 - Operation1 Client3 - Operation1

实现此目的的一种方法是使用以下类:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是每当我更改Client界面时,我还必须更改Clients类.有没有办法动态生成Clients类(或类似的东西)?

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

Vse*_*nin 5

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

用法:

new Clients().Execute(x => x.Operation1(someString, someInt));
new Clients().Execute(x => x.Operation2());
Run Code Online (Sandbox Code Playgroud)

使用此示例,您不必在Clients类中实现该接口,并且不必在每次接口更改时重新对其进行重新控制.