Ok, wie es scheint werde ich den Kampf gegen unnötigen Quellcode aufgeben müssen. Immerhin wurde es durch die Erweiterungsmethoden etwas aufgeräumter:
Durch Reflektion kann zur Runtime einiges angestellt werden. ZB anhand des aktuellen Typs eine Überladung einer Methode auswählen -> und das ist genau das Problem vor dem du stehst.
Schau dir mal das Beispiel an. Wenn ich das Problem richtig verstanden habe ist das eine Elegante Lösung wenn der Quellcode von ITour4UObject nicht geändert werden soll:
[highlight=c#]
using System;
using System.Collections.Generic;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Kunde k = new Kunde();
Mitarbeiter m = new Mitarbeiter();
List<ITout4UObject> list = new List<ITout4UObject> { k, m };
k.Save();
m.Save();
foreach (ITout4UObject item in list)
item.Save();
}
}
interface ITout4UObject { }
class Kunde : ITout4UObject { }
class Mitarbeiter : ITout4UObject { }
static class MyExtensions
{
public static bool Save(this ITout4UObject tourObject)
{
Type t = typeof(MyExtensions);
MethodInfo mi = t.GetMethod("Save", new Type[] { tourObject.GetType() });
object result = mi.Invoke(null, new object[] { tourObject });
return (bool)result;
}
public static bool Save(this Kunde kunde)
{
Console.WriteLine("Speicher Kunde.");
return true;
}
public static bool Save(this Mitarbeiter mitarbeiter)
{
Console.WriteLine("Speichere Mitarbeiter.");
return true;
}
}
}
[/highlight]
Die if/switch Verzweigung wurde durch Reflektion ersetzt bei der die entsprechende Überladung zur Laufzeit anhand des vorliegenden konkreten Typs gewählt wird.
mfG Gü
Comment