Base nutzen mit IXmlSerializable + Vererbung

domidragon

Fleet Admiral
Registriert
Juli 2008
Beiträge
11.532
Hi,

Ich hab hier ein kniffliges Problem, vielleicht weiss einer von euch weiter. Suche schon seit Stunden in Google, komme aber nicht vom Fleck.

Ich versuche in einer abgeleiteten Klasse mit "Base" auf die Variable (in einer Methode) der Stammklasse zu kommen. Das ganze passiert aber in der WriteXml() Methode von IXmlSerializable.

Einfach gesagt:
Ich schreib im WriteXml() der Stammklasse werte in den Writer und will diesen writer in der abgeleiteten mit Base erweitern. Er gibt mir aber immer die Fehlermledung: "Die Verwendung des base-Schlüsselworts ist in diesem Kontext nicht gültig:

Hier der Code:
Stammklasse:
Code:
public partial class ConfigElement : UserControl, System.Xml.Serialization.IXmlSerializable, ISettingsElement
{
        void System.Xml.Serialization.IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
        {
            writer.WriteAttributeString("SystemName", ((ISettingsElement)this).SystemName);
            writer.WriteElementString("DisplayName", ((ISettingsElement)this).DisplayName);
            writer.WriteElementString("Value", ((ISettingsElement)this).Value);
        }
}

Abgeleitete Klasse:
Code:
public partial class TextboxConfigElement : ConfigElement, ISettingsElement<string>, IXmlSerializable
    {
void System.Xml.Serialization.IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
        {
            ((IXmlSerializable)base).WriteXml(writer);

            //((System.Xml.Serialization.IXmlSerializable)base).WriteXml(writer);
            
        }
    }


Falls ihr noch weitere Infos braucht, einfach fragen.

Vielleicht weiss einer ne andere Möglichkeit, wie man das lösen könnte. Aber sollte ja rein theoretisch eigentlich klappen.

Vielen Dank schon mal.

greez
 
Code:
using System.Xml;
using System.Xml.Serialization;

Code:
public partial class ConfigElement : UserControl, IXmlSerializable, ISettingsElement
{
    void WriteXml( XmlWriter writer )
    {
        writer.WriteAttributeString( "SystemName", ((ISettingsElement)this).SystemName );
        writer.WriteElementString( "DisplayName", ((ISettingsElement)this).DisplayName );
        writer.WriteElementString( "Value", ((ISettingsElement)this).Value );
    }
}


Code:
public partial class TextboxConfigElement : ConfigElement, ISettingsElement<string>
{
    new void WriteXml( XmlWriter writer )
    {
        base.WriteXml( writer );
    }
}

Was dir das allerdings bringen soll ist mir schleierhaft :D
 
Das Problem ist, dass du in einer expliziten Methoden-Implementierung einer Schnittstelle in einer abgeleiteten Klasse versuchst, auf eine expliziten Methoden-Implementierung einer Schnittstelle in der Basisklasse zuzugreifen. Das funtioniert nicht - die Fehlermeldung sagt das auch aus (falscher Kontext).

Versuchs mal in der abgeleiteten Klasse mit folgendem Code: ((IXmlSerializable)((ConfigElement)this)).WriteXml(writer);

Das ganze ist jedoch viel zu kompliziert, man castet ohne Ende. Normalerweise macht man das so: eine protected virtual Methode in der Basisklasse implementieren, die man dann in der abgeleiteten Klasse überschreibt, dort aber die Implementierung aus der Basisklasse nutzt. Sieht dann so ungefähr aus (ungetestet):
Code:
public partial class ConfigElement : UserControl, System.Xml.Serialization.IXmlSerializable, ISettingsElement
{
        protected virtual void WriteXml(System.Xml.XmlWriter writer)
        {
                //Code für Werte schreiben in der Stammklasse
        }

        void System.Xml.Serialization.IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
        {
               WriteXml(writer);
        }
}
Dann ist die abgeleitete Klasse:
Code:
public partial class TextboxConfigElement : ConfigElement, ISettingsElement<string>, /* IXmlSerializable */
    {
        protected override void WriteXml(System.Xml.XmlWriter writer)
        {
                //Methode in Basisklase aufrufen
                base.WriteXml(writer);
                //Hier den Code für Werte schreiben in der abgeleiteten Klasse hin tun
        }
     }
}
Deine abgeleitete Klasse braucht dann noch nicht einmal die Schittstelle IXmlSerializable zu implementieren, da bereits die Basisklasse sie implementiert, es sei denn du braucht eine andere explizite Implementierung der Schnittstelle in der abgeleiteten Klasse.
 
Ich brauch eine mehrfach vererbung, was virtual(in C#) ja nicht kann, soviel ich weiss :)

ach die explizite wars, danke jetzt funktionierts :)

Das ergebnis soll ein configmanager sein, der für jede anwendung relativ einfach anpassbar ist, aber immer im selben stil ist ;) und natürlich einfach erweiterbar etc...

dann kann ich ja mal weiter werkeln

dank euch beide.
 
Zurück
Oben