So führen Sie ein Downcasting eines nicht generischen Basisklassenobjekts in ein generisches abgeleitetes Klassenobjekt C#

Ein Treffpunkt für C#-Programmierer
Guest
 So führen Sie ein Downcasting eines nicht generischen Basisklassenobjekts in ein generisches abgeleitetes Klassenobjekt

Post by Guest »

Ich habe zwei Klassen: eine nicht generische Basisklasse Node und eine generische abgeleitete Klasse Node. Die Knoten bilden eine verkettete Liste, wobei jeder Knoten möglicherweise einen anderen Datentyp enthält.

Code: Select all

    public class Node{
public Node NextNode{get; set;}
public static Node WithData(T data) => new Node(data);
}
public class Node: Node{
public T Data{get; set;}
public Node(T data) => Data = data;
}
Die Klassen können wie folgt verwendet werden:

Code: Select all

    var node1 = Node.WithData(73);      // the node contains an int
var node2 = Node.WithData("Good luck!");    // the node contains a string
node1.NextNode = node2;         // chaining the nodes
Notify(node1.Data == 73));  // displays "true" (method Notify() omitted for brevity)
Notify(node1.NextNode.GetType());       // displays "Node`1[System.String]"
Notify(node1.NextNode.Data == "Good luck!");
//compile error: 'Node' does not contain a definition for 'Data'
Der Compiler beschwert sich, weil NextNode zu Node hochgestuft wird und nicht mehr vom Typ Node, obwohl GetType() den richtigen generischen Typ anzeigt.
Ich kann das Problem lösen, indem ich zurück zu Node (Typprüfungen entfallen für Kürze):

Code: Select all

   Notify(((Node)node.NextNode).Data);
// verbose and the casting type is usually not known at compile time

Code: Select all

    Notify(((dynamic)node.NextNode).Data); // slow, but works fine at runtime

Code: Select all

    if(node.NextNode is Node stringNode) Notify(stringNode.Data);
else if(node.NextNode is Node intNode) Notify(intNode.Data);
// else if... etc.
// bad for maintenance, verbose, especially with many data types
Meine Fragen sind:[/b]
  • Gibt es eine geeignetere Möglichkeit, Node auf Node herunterzuwandeln (vorzugsweise zur Laufzeit)?

    < li>Gibt es einen besseren Ansatz oder ein besseres Design der beiden Klassen, um das zu vermeiden oder zu automatisieren? niedergeschlagen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post