Schau dir dazu vielleicht auch mal die Operator-Überladung an, im speziellen Implicit. Damit bräuchtest du dann dieses AsString oder AsInteger nicht. Der Konvertierung würde dann alles automatisch funktionieren.
Besser für Refactoring wäre es, wenn du entsprechende Properties nutzen würdest. So handhabe ich das ganze -- momentan gibts den Code nur in VB.Net, portiere den aber bald nach Delphi:
Delphi-Quellcode:
// Habe die Property mal aufs Minimum reduziert
TXmlConfigurationNodeAttribute =
class(TAttribute)
public
property Path :
string read GetPath;
end;
TBaseConfiguration =
abstract class
protected
FXmlPathToPropertyIndex : IDictionary<
string, TRttiProperty>;
// Diese Methode baut einen Index aus Pfad-zu-Property
// Wertpaaren auf, welcher dann in der LoadConfiguration
// genutzt wird
procedure ReadXmlProperties();
public
// Diese Methode liest aus dem XML-Node die entsprechenden
// Daten aus und setzt die gelesenen Werte via RTTI auf die
// entsprechenden Properties. Natürlich wird dabei eine
// Konvertierung der Datentypen vorgenommen.
procedure LoadConfiguration(XmlNode: IXmlNode);
end;
// Die Methode ist nur schnell hingeschrieben, die Idee soll
// rüberkommen!
procedure TBaseConfiguration.LoadConfiguration(XmlNode: IXmlNode);
begin
for PathPropertyPair
in FXmlPathToPropertyIndex
begin
Path := PathPropertyPair.Key;
Property := PathPropertyPair.Value;
Value := GetValueFromXml(XmlNode, Path);
Property.SetValue(Self, Convert(Value,
Property));
end;
end;
// So, was bringt das nun? Je Anwendung brauche ich dann nur noch
// eine abgeleitete Klasse schreiben, die minimalen Code enthält,
// aber dennoch dafür sorgt, dass alles passt und dazu auch noch
// wunderbar typsicher ist.
TMyConfiguration =
class(TBaseConfiguration)
public
[XmlConfigurationNode('
ftp-server/host')]
property Host :
string read FHost
write SetHost;
[XmlConfigurationNode('
ftp-server/port')]
property Port : Integer
read FPort
write SetPort;
end;
Vielleicht findest die Idee ja interessant
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)