Ich schreibe ein Werkzeug, das mit einer API für ein anderes Stück Software zusammenarbeitet. Ein Teil meines Tools muss Berichte über die verschiedenen über die API gefundenen Objekte generieren, und ich möchte, dass diese Berichte einfache Zeichenfolgen enthalten, die jedes Objekt identifizieren. Standardmäßig möchte ich ToString() verwenden, um die Zeichenfolge für jedes Objekt zu generieren. Wie auch immer, ich habe festgestellt, dass die Standard-ToString() - Implementierungen in dieser API nicht beschreibend sind.Kann ich ToString() für Klassen in einer öffentlichen API überschreiben?
Am Anfang dachte ich an etwas wie den Code unten mit einer langen Switch-Anweisung. Obwohl dies höchstwahrscheinlich unhandlich lange werden würde.
Als nächstes versuchte ich mit Erweiterungsmethoden (siehe den Code unten). CustomObjectDescription() funktionierte wie erwartet, aber als ich versuchte, ToString() aufzurufen, gab es nur die standardmäßigen ToString() - Ergebnisse zurück. Ich habe noch nie Extensionsmethoden verwendet, so dass ich komplett verrückt sein könnte und denke, dass so etwas überhaupt möglich ist.
Ich kann nicht garantieren, dass es eine CustomObjectDescription() -Erweiterung für jeden Typ in der API geben wird. Wenn ich diese Route nehme, müsste ich jedes Mal Reflektion verwenden, um zu überprüfen, ob das aktuelle Objekt a hat GetObjectDescription() Erweiterung. Ich möchte die Reflexion möglichst vermeiden.
public static class APIObjectDescriptionExtensions
{
public static string ToString(this APIObject element)
{
return "ElementName = " + element.Name + " ElementID =" + element.Id.IntegerValue.ToString();
}
public static string CustomObjectDescription(this APIObject element)
{
return "ElementName = " + element.Name + " ElementID =" + element.Id.IntegerValue.ToString();
}
}
Hat jemand andere Vorschläge, wie ich dieses Problem angehen sollte? Ich würde eine Lösung bevorzugen, bei der der Code für jeden API-Typ unabhängig voneinander ist (keine riesige Switch-Anweisung).
Wenn möglich, möchte ich auch die Beschreibung String-Code für einen Typ zu Untertypen erben, es sei denn, diese Typen haben ihre eigenen eindeutigen Beschreibung String-Code.
Ich denke, es könnte eine bessere Lösung geben, die das Erstellen von benutzerdefinierten TypeConverter oder das Überschreiben/Erweitern von System.Convert.ToString() beinhaltet?
aktualisieren
denke ich, das folgende Beispiel helfen könnte zu klären, was zu tun, ich versuche. Letztendlich möchte ich in der Lage sein, jede beliebige Klasse aus dieser API zu nehmen, deren Typ bis zur Laufzeit nicht bekannt ist, und eine Beschreibung zu generieren. Wenn der Typ meine benutzerdefinierte Erweiterungsmethode hat, sollte sie verwendet werden, ansonsten sollte der Code auf den alten ToString() zurückgreifen.
public static string GetDataDescription(object o)
{
//get the type of the input object
Type objectType = o.GetType();
//check to see if a description extension method is defined
System.Reflection.MethodInfo extensionMethod = objectType.GetMethod("MyDescriptionExtensionMethod");
if (extensionMethod != null)
{
//if a description extension method was found returt the result
return (string)extensionMethod.Invoke(o, new object[] { });
}
else
{
//otherwise just use ToString();
return o.ToString();
}
}
Dieser Code oben nicht aber, weil Erweiterungsmethoden funktioniert aren't found by GetMethod().
Sie können eine Instanzmethode nicht mithilfe von Erweiterungsmethoden ausblenden, da Instanzmethoden zuerst überprüft werden, wenn der Compiler versucht, einen Methodenaufrufausdruck zu binden. Einzelheiten finden Sie in der Spezifikation (§7.6.5.1). – jason
Eine Instanzmethode wird immer vor jeder Erweiterungsmethode mit demselben Namen verwendet (alle anderen sind gleich). Die Verwendung von ToString ist also nicht möglich. – BrokenGlass
Mögliches Duplikat von http://StackOverflow.com/Questions/4093501/How-Do-I-Override-Tostring-and-Implement-Generic?RQ=1 –