08 July 2008 C# 3.0, DRY, Extensions, generics, HowTo Robert Muehsig

C# 3.0 bringt ein nettes Feature mit: Extensions.

Generell sind die recht einfach, allerdings sind die meisten Beispiele ohne Generics gemacht.

Meine Problemsituation:
In einem Projekt waren einige Klasse von List<...> abgeleitet:

    public class MyList : List<MyObject>
    {
        ...
    }

Jede dieser "Listenklassen" hatte eine kleine Methode, welche diese Liste durchgeht und eine Aktion auslöst.

Ganz nach dem Prinzip: Keep it DRY
Don´t repeat yourself - daher müssen diese eigentlich gleichen Methoden weg und in eine Extension Methode. Da der Syntax von den generischen Extensions mir etwas Zeit geraubt hat, stell ich ihn mal der Allgemeinheit offen.

In unserem Beispiel:
Wir wollen eine kleine Extension schreiben, welche mehrere Elemente an eine ICollection anfügt - kann man auch über AddRange lösen, aber z.B. hat die ObservableCollection das nicht - daher nehmen wir einfach mal dieses Beispiel.

Source Code:
Main:

class Program
    {
        static void Main(string[] args)
        {
            List<int> intList = new List<int>();
            intList.Add(1);
            intList.Add(2);
            intList.Add(3);

            List<int> newIntList = new List<int>();
            newIntList.Add(4);
            newIntList.Add(5);

            intList.Add(newIntList);

            foreach (int myInt in intList)
            {
                Console.WriteLine(myInt); // Should be 1,2,3,4,5
            }
           
            Console.ReadLine(); 
        }
    }

Extension:

    public static class Extensions
    {
        public static ICollection<T> Add<T>(this ICollection<T> src, ICollection<T> addingElements)
        {
            foreach (T element in addingElements)
            {
                src.Add(element);
            }
            return src;
        }
    }

Resultat: Viele Ts und eine kleine generische Extension.

[ Download Source Code ]


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!