Я думаю с помощью функции, прекрасен.
более интересный вопрос состоит в том, как Вы определяете который регистратор загрузиться? Одна опция состоит в том, чтобы иметь абстрактный класс Регистратора, который конкретные реализации разделяют на подклассы, затем выполняют итерации по __subclasses__()
вызов is_registrar_for()
метод класса:
class Registrar(object):
def __init__(self, domain):
self.domain = domain
class RegistrarA(Registrar):
@classmethod
def is_registrar_for(cls, domain):
return domain == 'foo.com'
class RegistrarB(Registrar):
@classmethod
def is_registrar_for(cls, domain):
return domain == 'bar.com'
def Domain(domain):
for cls in Registrar.__subclasses__():
if cls.is_registrar_for(domain):
return cls(domain)
raise ValueError
print Domain('foo.com')
print Domain('bar.com')
Это позволит Вам прозрачно добавить новый Registrar
с и делегировать решение, которых доменов каждый поддерживает им.
Вы можете использовать XDocument.CreateReader ()
для создания XmlReader
, который считывает содержимое XDocument
.
] Аналогично, следующее тоже будет работать:
XmlReader GetReader(XDocument doc)
{
return doc.Root.CreateReader();
}
Просто подумал, что должен добавить, что после создания XmlReader, т.е.:
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
XmlReader reader = xmlDocumentToDeserialize.CreateReader();
затем вы должны вызвать:
reader.MoveToContent();
потому что иначе читатель не будет "указывать" на первый узел, вызывая появление пустого читателя! Затем можно смело вызывать Deserialize:
MyObject myObject = (MyObject)serializer.Deserialize(reader);