C# – Typisierte LINQ to Objects Abfrage auf ein ArrayList

 Entwicklung, Hilferuf und Lösung  Kommentare deaktiviert für C# – Typisierte LINQ to Objects Abfrage auf ein ArrayList
Jul 262010
 

Da war einiges nötig bis ich den dreh raus hatte bzw. den richtigen Tipp bekam.

Anforderung:

Ich habe ein ArrayList mit Objekten vom Typ Person drin. ArrayList deshalb weil die Kollektion COM Visible sein muss. Generics funktionieren da nicht.

Ich wollte aber den Komfort, typsichere Abfragen zu machen, auch auf einem ArrayList haben. Wenn man mal den Dreh bei LINQ to Objects raus hat will man es nicht mehr abgeben.

ArrayList arl = new ArrayList();
arl.Add(new Person(){ID= .......});
arl.Add(new Person(){ID= .......});
arl.Add(new Person(){ID= .......});
Person person = arl.Where(p => p.ID == ID).FirstOrDefault(); //Geht nicht.
Lösung:
Person person = arl.OfType<Person>().Where(p => p.ID == ID).FirstOrDefault();

Einfach zwischen der Kollektion und Where ein OfType<T>() reinhängen.

Und wie gesagt, ich hätte gerne auf Generics zurückgegriffen. Aber COM Visible geht damit nicht.

kick it on dotnet-kicks.de

C# – Generisch serialisieren und deserialisieren

 Entwicklung  Kommentare deaktiviert für C# – Generisch serialisieren und deserialisieren
Nov 232009
 

Etwas, was ich in der Softwareentwicklung häufig brauche, ist das Serialisieren und Deserialisieren von Objekten.

Über dieses Thema habe ich im Jahre 2005 auch schon mal was geschrieben.

Objekt serialisieren und deserialisieren

Seit dieser Zeit hat sich aber einiges getan. .NET wurde um die Generics erweitert. Damit lassen sich ganz schöne Sachen machen.

Zum Beispiel, generisch serialisieren und deserialisieren

public static void Save<T>(T objectForSave, string fileName)
{
	using(FileStream fs = new FileStream(fileName, FileMode.Create))
	{
		XmlSerializer xml = new XmlSerializer(typeof(T));
		xml.Serialize(fs, objectForSave);

		fs.Flush();
	}
}

public static T Load<T>(string fileName)
{
	using(FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
	{
		XmlSerializer xml = new XmlSerializer(typeof(T));
		return (T)xml.Deserialize(fs);
	}
}

In diesem Beispiel wird der XmlSerializer verwendet. Allerdings kann man auch den BinaryFormatter für die Aufgabe her nehmen.

Der Einsatz der Methoden ist sehr einfach.

Foo foo = new Foo();
Save<Foo>(foo, "c:\foo.txt");
foo = Load<Foo>("c:\foo.txt");

kick it on dotnet-kicks.de