想要说明的是,如果有人将答案作为扩展方法提供,则不必担心,因为扩展方法只是调用实例方法的一种很酷的方法。我了解您在不使用扩展方法的情况下想要答案。无论方法是定义为静态、实例还是扩展,结果都是一样的。
下面的代码使用接受答案中的代码来定义扩展方法和实例方法,并创建一个单元测试以显示输出相同。
public static class Extensions
{
public static void Each<T>(this IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}
}
[TestFixture]
public class ForEachTests
{
public void Each<T>(IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}
private string _extensionOutput;
private void SaveExtensionOutput(string value)
{
_extensionOutput += value;
}
private string _instanceOutput;
private void SaveInstanceOutput(string value)
{
_instanceOutput += value;
}
[Test]
public void Test1()
{
string[] teams = new string[] {"cowboys", "falcons", "browns", "chargers", "rams", "seahawks", "lions", "heat", "blackhawks", "penguins", "pirates"};
Each(teams, SaveInstanceOutput);
teams.Each(SaveExtensionOutput);
Assert.AreEqual(_extensionOutput, _instanceOutput);
}
}
从字面上看,要将扩展方法转换为实例方法,您唯一需要做的就是删除 static 修饰符和方法的第一个参数。
这个方法
public static void Each<T>(this IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}
变成
public void Each<T>(Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}