Dies ist eine Erweiterung von BigJims brillanter Antwort .
In meinem Fall hatte ich eine NodeBase
Klasse mit einem Children
Wörterbuch, und ich brauchte eine Möglichkeit, generisch O (1) -Suchen von den Kindern durchzuführen. Ich habe versucht, ein privates Wörterbuchfeld im Getter von zurückzugeben Children
, daher wollte ich natürlich teures Kopieren / Iterieren vermeiden. Deshalb habe ich Bigjims Code verwendet, um das Dictionary<whatever specific type>
in ein generisches umzuwandeln Dictionary<NodeBase>
:
// Abstract parent class
public abstract class NodeBase
{
public abstract IDictionary<string, NodeBase> Children { get; }
...
}
// Implementing child class
public class RealNode : NodeBase
{
private Dictionary<string, RealNode> containedNodes;
public override IDictionary<string, NodeBase> Children
{
// Using a modification of Bigjim's code to cast the Dictionary:
return new IDictionary<string, NodeBase>().CastDictionary<string, RealNode, NodeBase>();
}
...
}
Das hat gut funktioniert. Schließlich stieß ich jedoch auf nicht verwandte Einschränkungen und erstellte schließlich eine abstrakte FindChild()
Methode in der Basisklasse, die stattdessen die Suche durchführen würde. Wie sich herausstellte, war das gegossene Wörterbuch damit überhaupt nicht mehr erforderlich. (Ich konnte es IEnumerable
für meine Zwecke durch ein einfaches ersetzen .)
Die Frage, die Sie möglicherweise stellen (insbesondere wenn die Leistung ein Problem darstellt, das Ihnen die Verwendung von .Cast<>
oder verbietet .ConvertAll<>
), lautet:
"Muss ich wirklich die gesamte Sammlung besetzen oder kann ich eine abstrakte Methode verwenden, um das für die Ausführung der Aufgabe erforderliche Spezialwissen zu speichern und so den direkten Zugriff auf die Sammlung zu vermeiden?"
Manchmal ist die einfachste Lösung die beste.