2

我知道这个问题可以通过说来回答,foreach(var item in items){item.doSomething()};但我所追求的略有不同。这里是界面。

可管理类 .cs

public interface ManagableClass : System.IDisposable
{
    void Initialize();
}

下面是我希望看到我的代码的样子

MainManagerClass.cs

public class MainManagerClass: ManagableClass
{
    private List<ManagableClass> minions;

    public void Initialize()
    {
        TellMinionsTo(Initialize);
    }

    public void Dispose()
    {
        TellMinionsTo(Dispose);
    }

    private void TellMinionsTo(Action doSomething)
    {
        foreach (ManagableClass minion in minions)
        {
            minion.doSomething();
        }
    }
}

我知道这里的这段代码不起作用,但似乎这在 C# 中应该是可行的。有人知道这是否可以做到吗?如果不是,这不像是世界末日,我只会foreach在每种方法中做一个。

4

2 回答 2

3

您的代码的问题是您将委托传递给某个实例(您自己)的方法,而您想要的是在所有奴才上调用某个方法。

您可以使用 lambda 表达式,例如

public void Dispose()
{
   TellMinionsTo(minion=>minion.Dispose());
}    


private void TellMinionsTo(Action<ManagableClass> doSomething)
{
    foreach (ManagableClass minion in minions)
    {
         doSomething(minion);
    }
}

我不喜欢直接使用 List 的方法。明天你将不得不通过一个界面工作,而你的 IList 可能根本不必是一个 List。

于 2014-05-17T18:44:54.380 回答
2

您正在寻找的是Composite 模式。此模式将允许您拥有一个实现正确方法并将其与项目列表不同的类。但是,在您的情况下,您需要修改接口以实现该DoSomething()方法。所以,相反,这应该是这样的。

public interface ISomething
{
    void DoSomething();
}

public class SomethingManager : ISomething 
{
    private List<ISomething> _items = new List<ISomething>();

    public void DoSomething()
    {
        _items.ForEach(i => i.DoSomething());
    }
} 

那是你要找的吗?

于 2014-05-17T18:31:50.737 回答