2016-08-03 7 views
0

Ich habe diese Klassen, teilweise Auflistung der relevanten Bits.C# Casting funktioniert nicht

public class IVRTopology {} 

public abstract class SANSwitch 
{ public string name { get; set; } 
} 

public class CiscoSwitch : SANSwitch 
{ 
    public IVRTopology IVRTop = new IVRToplogy() 
} 

class SwitchViewModel : INotifyPropertyChanged 
{ 
    public SANSwitch sanswitch { get; set; } 
} 

Wenn ich etwas tun, wie folgt aus:

SwitchViewModel svm = new SwitchViewModel(); 
svm.sanswitch = new CiscoSwitch(); 
IVRTopology topo = svm.sanswitch.IVRTop; 

der Compiler mir warnt davor, dass svm.sanswitch vom Typ SANSwitch und haben keine Definition für IVRTop wenn ich versuche IVRTop zugreifen thusly:

IVRTopology topo = (CiscoSwitch)svm.SANSwitch.IVRTop 

funktioniert auch nicht. Ich möchte der abstrakten Klasse keine Definition für IVRTopology hinzufügen, da ich andere Unterklassen davon haben werde, die sie nicht verwenden. Stimmt etwas nicht mit der Besetzung? Wie kann ich das schaffen? Ich möchte, dass das Ansichtsmodell schließlich verschiedene Arten von Switches unterstützt.

Antwort

4

Casting ist eine niedrigere Priorität als der Operator ..

Deshalb, wenn Sie den folgenden Code ausführen:

IVRTopology topo = (CiscoSwitch)svm.SANSwitch.IVRTop 

Sie führen effektiv

var ivrTop = svm.SANSwitch.IVRTop; 
IVRTopology topo = (CiscoSwitch)ivrTop; 

Die einfache Lösung ist Klammern zu verwenden, um die richtige Auflösung zu erzwingen:

IVRTopology topo = ((CiscoSwitch)svm.SANSwitch).IVRTop 
0

Ihre Syntax ist falsch.

IVRTopology topo = ((CiscoSwitch)svm.SANSwitch).IVRTop; 
1

Sie werfen das Ergebnis svm.SANSwitch.IVRTop, wenn Sie tatsächlich svm.SANSWitch wie diese zuerst werfen wollen:

((CiscoSwitch) svm.SANSwitch).IVRTop 

Noch besser ist, in C# Sie sicher Gießen haben (da (CiscoSwitch) svm.SANSwitch könnte einen Fehler aus, wenn es der falsche Typ ist), können Sie etwas Ausgefallenes wie folgt tun:

(svm.SANSwitch as CiscoSwitch)?.IVRTop 

Zuerst haben wir eine sichere Besetzung zumachen, die Null sein könnte, dann propagieren wir Null ? und rufen den Wert ab. Null Propagation funktioniert nur, wenn der resultierende Wert nicht Null ist - also ist alles in dieser Zeile ziemlich sicher. Dann möchten Sie vielleicht überprüfen, ob es in erster Linie gelungen ist.