Aus der Praxis – Umwandeln einer Liste in eine Liste der Basisklasse
avatar

Folgende Situation: Es gibt eine abstrakte Basisklasse (z.B. PrincipleBase) und eine Klasse, die von dieser erbt (z.B. Group) und eine Aufzählung von Group Objekten soll nun einer Eigenschaft oder Methode übergeben werden, die aber eine Aufzählung der Basisklasse erwartet:

public abstract class PrincipalBase { }
public class Group : PrincipalBase { }

// …

public static void LoadPrincipals(IEnumerable<PrincipalBase> principals) { }

Wie kann nun der Methode LoadPrincipals z.B. eine Liste List<Group> groups zugewiesen werden? Seit .NET 4.0 gibt es hier dank der neu hinzugekommenen generic covariance die Möglichkeit dies direkt zuzuweisen. In .NET 3.5 gibt es die Methode IEnumerable.Cast (System.Linq), diese castet jedes Element der Aufzählung in den Zieltyp und gibt diese als IEnumerable zurück.

LoadPrincipals(groups.Cast<PrincipalBase>());

Auch für den umgekehrten Weg gibt es eine Methode: IEnumerable.OfType, diese filtert nach dem Zieltyp und gibt nur passende Elemente zurück.

List<PrincipalBase> usersAndGroups = GetUsersAndGroups();
IEnumerable<Group> onlyGroups = usersAndGroups.OfType<Group>();

Bei noch älteren .NET Versionen muss leider ganz klassisch die Aufzählung mit einer Schleife durchlaufen und von Hand gecastet werden.

Ein Gedanke zu “Aus der Praxis – Umwandeln einer Liste in eine Liste der Basisklasse
avatar

  1. Pingback: Aus der Praxis – Umwandeln einer Liste in eine Liste der Basisklasse - SharePoint Blogs in German - Bamboo Nation

Schreibe einen Kommentar