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成员设置为
MyAction
,并将其设置为不同的方法,如
Method3
。请看。您是否考虑过将动作集合作为字典?您的想法是正确的,它将消除switch语句。将
操作方法添加到CallDelegate成员设置为
MyAction
,并将其设置为不同的方法,如
Method3
。看见
Action = Console.WriteLine