6

私はほぼ同じパターンの約20の関数を持っています。サイトの配列で実行し、Siteオブジェクトを使用してSiteOperationを作成し、いくつかの操作を実行します(この場合、1つのパラメーターを使用しますが、それ以上ない場合もあります)

int wantedBandwidthInLBps = 2048 / 8;
foreach (Sites site in _sitesManagement.GetAll())
{
 SiteOperation siteOperation = new SiteOperation(site);
 siteOperation.LimitBandwidth(wantedBandwidthInLBps);
}

foreach (Sites site in _sitesManagement.GetAll())
{
 SiteOperation siteOperation = new SiteOperation(site);
 siteOperation.KillJames();
}

foreach (Sites site in _sitesManagement.GetAll())
{
 SiteOperation siteOperation = new SiteOperation(site);
 siteOperation.FlyToMoon(2012, new TaskIdentifier(10,20));
}

このコードをラップすることは可能ですか?それで、すべてのサイトでこのアクションを実行する_sitesManagementなどのアクションを送信しますか?

4

4 に答える 4

4

これを試して:

void PerformOperationOnAllSites(Action<SiteOperation> doIt) {
    foreach (Sites site in _sitesManagement.GetAll()) {
        SiteOperation siteOperation = new SiteOperation(site);
        doIt(siteOperation);
    }
}

...

_sitesManagement.PerformOperationOnAllSites(op => op.LimitBandwidth(wantedBandwidthInLBps));
_sitesManagement.PerformOperationOnAllSites(op => op.KillJames());
_sitesManagement.PerformOperationOnAllSites(op => op.FlyToMoon(2012, new TaskIdentifier(10,20));
于 2012-06-05T12:35:03.053 に答える
1
public void DoSiteOperationActions(Action<SiteOperation> toDo)
{
        foreach (Sites site in _sitesManagement.GetAll())
        {
           SiteOperation mySiteOperation = new SiteOperation(site);
           toDo(mySiteOperation);
        }
}

そして、あなたはそれを次のように呼ぶことができます...

DoSiteOperationActions(so => so.FlyToMoon(2012, new TaskIdentifier(10,20)));

構文が少しずれている可能性があります。ここにはIDEがありませんが、詳細については http://msdn.microsoft.com/en-us/library/018hxwa8.aspxを参照してください。

于 2012-06-05T12:39:31.820 に答える
0
    private static void InvokeMethod(Action<SiteOperation> action)
    {
        foreach (SiteOperation siteOperation in _sitesManagement.GetAll()
                               .Select(site=>new SiteOperation(site))
        {
            action(siteOperation);
        }
    }
..

    public static void KillJames()
    {
        InvokeMethod(so => so.KillJames());
    }

    public static void LimitBandwidth(int wantedBandwidthInLBps)
    {
        InvokeMethod(so => so.LimitBandwidth(wantedBandwidthInLBps));
    }

    public static void FlyToMoon(int year=2012, TaskIdentifier ti=new TaskIdentifier(10,20))
    {
        InvokeMethod(so => so.FlyToMoon(year, ti));
    }
于 2012-06-05T12:44:47.380 に答える
0

これは、テンプレートメソッドパターンの適切な候補のように思えます。

http://en.wikipedia.org/wiki/Template_method_pattern

于 2012-06-05T12:33:26.953 に答える