Hier weet men alles, dat is een feit

dus ik dacht ik stel em maar hier ipv een dev forum
Ik heb met een babbel met een collega van mij (die nu helaas weg is, anders had ik het hem gevraagd) interesse ontwikkeld in het GoF pattern "Visitor". Maar nu zat ik thuis een beetje te experimenteren en kwam eigenlijk op het idee om dit pattern wat sterker te maken. Nu weet ik eigenlijk niet of ik het goed doe en of ik het concept visitor nou echt doorheb. Ik ga er van uit van niet omdat ik dus het "Accept" deel niet toepas.. wat dus wel moet.
Code:
public void Visit(CharSheetElement element, XmlNode charSheetNode)
{
foreach (XmlNode currNode in charSheetNode.ChildNodes)
{
var property = element.GetType().GetProperty(currNode.Name);
if (property.PropertyType.IsSubclassOf(typeof(CharSheetElement)))
{
var subElement = property.PropertyType.GetConstructor(new Type[0]).Invoke(new object[0]) as CharSheetElement;
property.SetValue(element, subElement, null);
CharSheetVisitor.Instance.Visit(subElement, currNode);
}
else if ((property.PropertyType.GetGenericArguments().Length > 0) && property.PropertyType.GetGenericArguments()[0].IsSubclassOf(typeof(CharSheetElement)))
{
var methodInfo = this.GetType().GetMethod("ParseList", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static);
var genericArgs = new Type[1];
genericArgs[0] = property.PropertyType.GetGenericArguments()[0];
methodInfo = methodInfo.MakeGenericMethod(genericArgs);
var currChildNodes = currNode.SelectNodes("./" + property.Name);
List<CharSheetElement> myList = new List<CharSheetElement>();
var args = new object[1];
foreach (XmlNode currChildNode in currNode.ChildNodes)
{
var childElement = property.PropertyType.GetConstructor(new Type[0]).Invoke(new object[0]) as CharSheetElement;
CharSheetVisitor.Instance.Visit(childElement, currChildNode);
myList.Add(childElement);
}
args[0] = myList;
var result = methodInfo.Invoke(this, args);
property.SetValue(element, result, null);
}
else
{
var methodInfo = this.GetType().GetMethod("Parse", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static);
var genericArgs = new Type[1];
genericArgs[0] = property.PropertyType;
methodInfo = methodInfo.MakeGenericMethod(genericArgs);
var args = new object[1];
args[0] = currNode.InnerText;
var result = methodInfo.Invoke(this, args);
property.SetValue(element, result, null);
}
}
}
dit is mijn implementatie ff voor de aannames:
- CharsheetElement is dus een boom van elementen die in deze code doorgelopen wordt met 3 condities:
-- Als het childelement een CharsheetElement is "Visit" zijn childelement;
-- Als het childelement een list van CharsheetElements is "Visit" elk van de elementen;
-- Als het een bekend basetype is, parse invoer naar uitvoer en klaar.
- Parse en ParseList zijn puur helper functies die een convert doet van basetypes.
Nu dus mijn vraag, sla ik de plank helemaal mis?