quiere poner por ahí que no hay mucho que preocuparse de si alguien da una respuesta como un método de extensión debido a una extensión método es solo una forma genial de llamar a un método de instancia. Entiendo que quieres la respuesta sin usar un método de extensión. Independientemente de si el método se define como estático, instancia o extensión, el resultado es el mismo.
El siguiente código utiliza el código de la respuesta aceptada para definir un método de extensión y un método de instancia y crea una prueba de unidad para mostrar que la salida es la misma.
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);
}
}
Literalmente, lo único que tiene que hacer para convertir un método de extensión a un método de instancia es quitar el modificador static
y el primer parámetro del método.
Este método
public static void Each<T>(this IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}
convierte
public void Each<T>(Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}
fresca. Ahora, ¿dónde entra en juego la sintaxis Func <> que he visto? – BuddyJoe
Los delegados de Func <> son delegados genéricos para los métodos con valores devueltos. Los delegados Action <> son delegados genéricos para los métodos SIN valores devueltos. Esa es la única diferencia. – TheSoftwareJedi
por lo tanto, en su caso, no necesita devolver algo (desde console.writeline - por lo que Acción es suficiente. –
TheSoftwareJedi