Как да се направи метод, който да работи с колекции от всякакъв тип данни?
Идеята ми е следната: Как може да се направи метод, който да може да разпечата не само int колекции, но и string, bool и прочее? Ето примерче, в което метода печата всякакви int колекции, но не печата string.
class TestProgram
{
static void Main(string[] args)
{
int[] integerArray = { 1, 2, 3 };
List<int> integerList = new List<int> { 4, 5, 6 };
List<string> stringList = new List<string> { "a", "b", "c", "d", "e" };
PrintCollection(integerArray);
PrintCollection(integerList);
//PrintCollection(stringList);
}
private static void PrintCollection(ICollection<int> inputCollection)
{
foreach (var item in inputCollection)
{
Console.WriteLine(item);
}
}
}
Благодаря на всички за отговорите! Само с IEnumerable знам, че не става, защото го пробвах вече :)
Ето така стана, по-надолу е кода, максимално опростен. Само да попитам, какво точно означава "екстеншън" и защо за да работи трябва или класът да е static, и долу пред аргумента да има this, или класът да не е статичен, и долу да няма this?
public static class TestProgram
{
public static void Main(string[] args)
{
int[] integerArray = { 1, 2, 3 };
List<int> integerList = new List<int> { 4, 5, 6 };
List<string> stringList = new List<string> { "a", "b", "c", "d", "e" };
PrintCollection(integerArray);
PrintCollection(integerList);
PrintCollection(stringList);
}
private static void PrintCollection<T>(this IEnumerable<T> inputCollection)
{
foreach (var item in inputCollection)
{
Console.WriteLine(item);
}
}
}
Като екстенжъни за коса. Удължители :D Добавяш методи към обектите от определен тип, без да модифицираш класа. За да стане това обаче C# са измислили, че класът и методите трябва да са статични и за да анотираш на обектите от кой тип ще правиш "удължаване" тряба да сложиш "this" пред типа.
Ти в момента не ги ползваш като екстеншън методи. Екстеншън методите се ползват върху обектите от тоя тип, а не се подават като параметър.
Много по-лесно ще стане ако напишеш в гугъл extension methods и четеш.
Както Royal спомена хем си създал extension метод, хем не го използваш... На всяка инстанция от тип IEnumerable се закача метода PrintCollection, така че за да го използваш може просто да използваш: