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.

1 Comments

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

Leave a comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.