I want to implement Craig Andera’s custom XML configuration handler in a slightly different scenario. What I want to be able to do is to read in a list of arbitrary length of custom objects defined as:
public class TextFileInfo
{
public string Name { get; set; }
public string TextFilePath { get; set; }
public string XmlFilePath { get; set; }
}
I managed to replicate Craig’s solution for one custom object but what if I want several?
Craig’s deserialization code is:
public class XmlSerializerSectionHandler : IConfigurationSectionHandler
{
public object Create(object parent, object configContext, XmlNode section)
{
XPathNavigator nav = section.CreateNavigator();
string typename = (string)nav.Evaluate("string(@type)");
Type t = Type.GetType(typename);
XmlSerializer ser = new XmlSerializer(t);
return ser.Deserialize(new XmlNodeReader(section));
}
}
I think I could do this if I could get
Type t = Type.GetType("System.Collections.Generic.List<TextFileInfo>")
to work but it throws
Could not load type 'System.Collections.Generic.List<Test1.TextFileInfo>' from assembly 'Test1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
I don’t think this would work in that scenario. Craig’s solution works well for simple object graphs, but collections are a little trickier. Lists are serialised as arrays, so putting your example in, a serialised List is something like:
Now, I’m guessing you could probably put that in a config, as long as the config section is named as “ArrayOfTextFileInfo”. Not exactly that friendly. I think what you should probably do is use the standard configuration classes to build this:
Once you’ve registered the config section:
You can add in the configs:
Using that in code:
Also, this:
Won’t work for a couple of reasons, you haven’t fully qualified the TextFileInfo type (needs a namespace), and your definition of a generic type is wrong (I can see why you haven’t specified it that way), it should look like:
Hope that helps!