Hallå! Jag är inte säker på att detta är rätt sätt att lösa ditt problem på men skulle det inte gå bra att skapa en conditonFactory och där skapa en statisk metod som tar din XML-sträng som en parameter. Metoden får sedan utvärdera XML-strängen och returnera en instans av rätt conditiontyp (concrete class). Sedan är det bara att köra Evaluate på den instansen. Om man vill använda XmlSerializer för att avserialisera en property som kan vara en nedärvd klass så kan man lösa det problemet du har med attributet XmlInclude, se http://www.topxml.com/xmlserializer/xmlincludeattribute.asp , men det fungerar inte (tror jag) om du har ett fast och förutbestämt XML-schema som inte XmlSerializer har skapat. Tackar för tipsen!Xmlserialisering och ärvda klasser
Jag har en undran om det finns någon lösning på detta eller om jag tänker helt fel..
Jag har funderingar på att använda 3 klasser (groupcondition,wmicondition,attributecondition) som ärver en klass kallad condition
Jag skulle nu vilja kunna deserialisera så att rätt klass automatiskt väljs vid deserialisering.
ex.
<code>
<Condition type="wmi">select * from .... </Condition>
</code>
skall deserialiseras som wmiconditionklassen medan
<code>
<Condition type="group">ekonomigrupp</Condition>
</code>
skall deserialiseras som groupcondition.
Syftet jag hade var att jag ska kunna ropa på en Evaluate()-metod som returnerar true/false om villkoret uppfylls.
pseudo:
<code>
class wmicondition : condition {
[XmlTextAttribute]
public string wmiquery;
public override bool Evaluate() {
// kontrollera wmi-query och returnera status
return true;
}
}
class groupcondition : condition {
[XmlTextAttribute]
public string groupname;
public override bool Evaluate() {
// Kontrollera grupptillhörighet
return true;
}
}
class condition {
public bool Evaluate() {
}
}
</code>
När jag sen deserialiserar in xml-filen så vill jag kunna ropa på Evaluate() och då ska rätt klass testa villkoret.
Klassen där det ska användas:
<code>
class Test {
public Condition condition;
public bool test() {
// Kod för att deserialisera in xml-filen till condition-variablen
//...
return condition.Evaluate()
}
}
</code>Sv: Xmlserialisering och ärvda klasser
Sv:Xmlserialisering och ärvda klasser
Lösningen då är förmodligen som föregående inlägg säger att göra någon slags factoryklass som löser problemet med att ta beslut om vilken klass som det egentligen skall bli.
/Andreas Sv: Xmlserialisering och ärvda klasser
Jag fick iordning på serialiseringen med XmlInclude. Dock så blev det "xsi:type" istället för "type" (kosmetika iofs).
Men jag ändrade mig lite och gjorde såhär istället:
På den collection (en typad collectionbase) som jag serialiserar så anger jag följande attribut (GroupCondition, AttributeCondition och WMICondition ärver ifrån Condition och ConditionList är min "hårdtypade" collection mot Condition-klassen)
[XmlArray("Conditions")]
[XmlArrayItem("Group",typeof(GroupCondition))]
[XmlArrayItem("Attribute",typeof(AttributeCondition))]
[XmlArrayItem("WMI",typeof(WMICondition))]
public ConditionList Conditions;
Detta resulterar i en XML-fil som ser ut ungefär såhär:
<Conditions>
<WMI .... > * from win32_product where name='blaha'</WMI>
<Group ....
<Group ....
<Attribute ...
<Attribute ...
<Attribute ...
</Conditions>