具有不同动作的相同功能取决于呼叫者

时间:2011-08-12 20:18:12

标签: c#

我不确定我所询问的是否可能,所以请耐心等待。

目前我有多个功能,每个功能都有相同的循环位和不同的动作。

我想要一个函数,其主要目的是遍历列表中的某些条目,并根据调用者执行不同的操作。

我的一个解决方案是使用switch / if块和来自调用者的唯一变量来确定操作。但是,我更多地考虑调用函数以及如何传递应该对每个条目执行的操作。

6 个答案:

答案 0 :(得分:5)

也许你的函数可以将Action<T>作为参数,每个调用者都可以提供自己的操作作为参数?

public void LoopOperation(Action<MyType> action)
{
    foreach(MyType myObject in myCollection)
    {
         action(myObject);
    }
}

您可以像下面这样称呼它:

LoopOperation(o => Console.WriteLine(o.ToString()));

或者可能如下:

LoopOperation(o => o.SaveToDatabase());

或者您要执行的任何其他操作。

答案 1 :(得分:4)

您可以使用某种形式的lamba(谓词)来执行类似

的操作
public void dosomethingfunciton(Func<YourType, ResultType> func)
{
     foreach(vat item in List)
     {
        var result = func(item);
     }

}

答案 2 :(得分:2)

我想用你似乎要达到的“使用代表”回答来回答这个问题......但是我想到了自己......为什么?它过于复杂,特别是如果你永远不会在其他一些例程中重复使用'action'代码。

所以,我要说点KISS的话:

enum MyActions
{
   Action1,
   Action2,
   Action3
}

public DoStuff(MyActions theAction, Itemlist theList)
{
   foreach (SomeItem in theList)
   {
       // do any common stuff

       switch (theAction)
       {
           case Action1:
              //Action 1 specific stuff
              break;
           case Action2:
              //Action 2 specific stuff
              break;
           case Action3:
              //Action 3 specific stuff
              break;
       }
   }
}

我知道......基本......但很简单,并且完成了工作。

答案 3 :(得分:2)

您可以简单地向函数添加一个参数,用于确定必须采取的操作。

public enum CallerType {
    RedCaller, GreenCaller, BlueCaller
}

public MyResultType MyFunction(CallerType callerType)
{
    switch (callerType) {
        case CallerType.RedCaller:
            DoRedCallerStuff();
            break;
        case CallerType.GreenCaller:
            DoGreenCallerStuff();
            break;
        case CallerType.BlueCaller:
            DoBlueCallerStuff();
            break;
        default:
            DoDefaultStuff();
            break;
    }
}

答案 4 :(得分:1)

您可以将操作传递给该功能。查看代理ActionAction<T>等,以查看有关如何将“操作”传递给函数的一些示例。

答案 5 :(得分:1)

对于稍微替代的策略,您可以通过interitance实现此目的:例如

public abstract class BaseLooper<TItem>
{
    public void DoLoop (List<TItem> list)
    {
        foreach (TItem item in list)
        {
            DoLoopAction(item);
        }
    }

    protected abstract void DoLoopAction(TItem item);
}

public class BlueLooper
    : BaseLooper<BlueClass>
{
    protected overrides DoLoopAction (BlueClass item)
    {
        ...Do Stuff
    }
}

注意:我没有运行这个,所以可能有奇怪的错误,但我相信你明白了!

这样做的好处是循环中执行的操作可能非常混乱 - 其他调用,要引入子类的属性等等。