C# 以各种顺序对集合中的对象执行多个方法
我的应用程序中的用户可以决定要为对象集合执行哪些活动和顺序。所有对象的顺序都在开头(一次)设置 应用程序应按照正确的顺序执行用户选择的方法 例如,我定义了操作列表:C# 以各种顺序对集合中的对象执行多个方法,c#,collections,foreach,C#,Collections,Foreach,我的应用程序中的用户可以决定要为对象集合执行哪些活动和顺序。所有对象的顺序都在开头(一次)设置 应用程序应按照正确的顺序执行用户选择的方法 例如,我定义了操作列表: this.ActionsList = new List<MyAction> { new MyAction {Id = "123", Order = 1, Text = "Method 5", IsActive = true}, new MyAction {Id = "abc", Order = 5, Te
this.ActionsList = new List<MyAction>
{
new MyAction {Id = "123", Order = 1, Text = "Method 5", IsActive = true},
new MyAction {Id = "abc", Order = 5, Text = "Method 1", IsActive = false},
new MyAction {Id = "def", Order = 3, Text = "Method 3", IsActive = true}
};
请忽略任何不准确之处
这个解决方案有效。但是,“开关”指令非常大。我有很多这样的行为。这可能不是最好的解决方案
我认为最好的解决方案是为每个对象“MyAction”指定适当的方法(委托):
我不知道如何才能实现它(或类似的解决方案)。
我希望我的代码在以后的版本中透明且简单。您可以向
MyAction
类添加一个委托
public Action<MyObjects> Action { get; set; }
诀窍是使用操作
代理接受MyObjects
作为参数。这允许您指定一个lambda表达式来调用此对象上的方法。如果需要,您甚至可以将参数传递给这些方法:
Action = o => o.StringMethod1("Hello")
Action = o => o.StringMethod2("Hello", "World")
或者做完全不同的事情
Action = o => o.Text = "okay"
Action = o => Console.WriteLine(o)
Action = o => { o.Text = "statement lambda"; Console.WriteLine(o); }
委托保持不变,因为它始终有一个MyObjects
参数
在需要调用与操作
委托兼容的方法的特殊情况下,可以将方法本身作为委托传递。省略参数括号表示不想在此处调用它
Action = Console.WriteLine
这将具有与Console.WriteLine(o)相同的效果,但效率更高。它将直接调用Console.WriteLine
,而不是调用从lambda表达式创建的委托,lambda表达式反过来调用Console.WriteLine
。(注意,我假设您已经在MyObjects
中重写了ToString
,否则这将只打印类型名称。)
另请参见:您可以将委托添加到
MyAction
类中
public Action<MyObjects> Action { get; set; }
诀窍是使用操作
代理接受MyObjects
作为参数。这允许您指定一个lambda表达式来调用此对象上的方法。如果需要,您甚至可以将参数传递给这些方法:
Action = o => o.StringMethod1("Hello")
Action = o => o.StringMethod2("Hello", "World")
或者做完全不同的事情
Action = o => o.Text = "okay"
Action = o => Console.WriteLine(o)
Action = o => { o.Text = "statement lambda"; Console.WriteLine(o); }
委托保持不变,因为它始终有一个MyObjects
参数
在需要调用与操作
委托兼容的方法的特殊情况下,可以将方法本身作为委托传递。省略参数括号表示不想在此处调用它
Action = Console.WriteLine
这将具有与Console.WriteLine(o)相同的效果,但效率更高。它将直接调用Console.WriteLine
,而不是调用从lambda表达式创建的委托,lambda表达式反过来调用Console.WriteLine
。(注意,我假设您已经在MyObjects
中重写了ToString
,否则这将只打印类型名称。)
另请参见:您是否考虑过将动作集合作为字典?您的想法是正确的,它将消除switch语句。将
操作方法添加到CallDelegate将code>成员设置为MyAction
,并将其设置为不同的方法,如Method3
。请看。您是否考虑过将动作集合作为字典?您的想法是正确的,它将消除switch语句。将操作方法添加到CallDelegate将code>成员设置为MyAction
,并将其设置为不同的方法,如Method3
。看见
Action = Console.WriteLine