如何使用Action<ITask>实现代理类批量执行接口实现类的对应方法
实现方案
1 修正原有代码的签名不匹配问题
原有代码存在接口和实现签名不一致的编译错误:ITask定义的PrintState()是无参方法,但Epic、Story类的实现携带了多余的string参数,先对齐签名:
public interface ITask { void PrintName(string props); void PrintState(); } public class Epic: ITask { public Epic() { } public void PrintName(string props) { Console.WriteLine("Hello Epic: " + props); } public void PrintState() // 去掉多余参数,和接口对齐 { Console.WriteLine("Epic Started"); } } public class Story: ITask { public Story() { } public void PrintName(string props) { Console.WriteLine("Hello Story: " + props); } public void PrintState() // 去掉多余参数,和接口对齐 { Console.WriteLine("Story Started"); } }
2 实现Action<>泛型通用执行逻辑
核心用Action<ITask>作为通用方法的入参,代表对单个ITask实例要执行的操作,不用硬编码方法名,直接通过委托传递执行逻辑:
public class TaskProxy : ITask { List<ITask> list; public TaskProxy (List<ITask> list) { this.list = list; } public void PrintName(string props) { // 传入委托:对单个ITask实例执行PrintName,携带props参数 Generic(tsk => tsk.PrintName(props)); } public void PrintState() { // 传入委托:对单个ITask实例执行PrintState Generic(tsk => tsk.PrintState()); } // 通用执行方法,遍历所有实例执行传入的操作 private void Generic(Action<ITask> methodToExecute) { foreach(ITask tsk in list) { methodToExecute(tsk); } } }
3 修正Main方法语法错误
原有Main方法存在缺少new关键字、语句缺分号的问题,修正后:
class Program { static List<ITask> list = new List<ITask>(); static void Main(string[] args) { list.Add(new Story()); list.Add(new Epic()); ITask task = new TaskProxy(list); // 补new关键字 task.PrintName("some props"); // 补分号 task.PrintState(); // 补分号 } }
运行输出结果
Hello Story: some props Hello Epic: some props Story Started Epic Started
内容的提问来源于stack exchange,提问作者Dexters
相关产品推荐
相关产品推荐

