Указать обратный вызов Action в виде данных с помощью xml, возможно, с атрибутом cref?

#c# #xml #xml-parsing #xmlreader

#c# #xml #синтаксический анализ xml #xmlreader

Вопрос:

У меня есть файл определений xml, и одним из атрибутов, который я хочу указать для объекта, является обратный вызов. Кажется возможным, что я мог бы указать обратный вызов, используя атрибут cref, но я не могу понять, как проанализировать его как метод или действие. Что-то вроде этого:

 <XML>
    <ClassData>
        <Callback cref="CallbackClass.CallbackMethod"/>
    </ClassData>
</XML>
  

Затем проанализировать его (на C #):

 Action callbackActions;    

XmlReader reader; // I'm skipping w/e code gets the xml text into the reader

while(reader.Read()) {
    switch(reader.Name) {
        case "Callback":
        Action callback = ??? // How do I parse the cref attribute as an Action here?
        callbackActions  = callback;
        break;   
    }
}
  

Или есть другой способ достичь той же цели?

Я где-то видел несколько похожее обсуждение, которое можно было бы выполнить с помощью reflection, сохранив CallbackClass и CallbackMethod в виде строк. Однако это кажется очень обходным подходом.

Спасибо за вашу помощь!

Ответ №1:

То, что вы описываете, технически возможно, но нецелесообразно. Вы могли бы использовать отражение, чтобы найти тип с именем CallbackClass с помощью метода с именем CallbackMethod . Но это открывает доступ к червям.

  • Вам нужно создать экземпляр CallbackClass? Если да, есть ли у него параметры конструктора?
  • Является ли CallbackMethod static ?
  • Существует ли вообще этот метод?

Когда вы вызываете методы в своем коде, компилятор заботится об этом за вас. Если вы попытаетесь вызвать метод, который не существует, он не будет компилироваться. Если вы попытаетесь вызвать метод экземпляра без создания экземпляра класса, он не будет компилироваться.

Если вы храните имена методов и классов вне вашего кода — в XML или практически во всем остальном — тогда вы теряете эту систему безопасности. Вы могли бы сослаться на метод, который не существует или который вы не можете вызвать по ряду причин.

Лучший подход — позволить вашему приложению определять, что оно должно делать, на основе того, что оно находит в XML-документе, а затем позволить вашему приложению решать, какие методы оно должно вызывать.

Например:

 while(reader.Read()) {
    switch(reader.Name) {
        case "Callback":
        callbackActions  = SomeClass.SomeMethod;;
        break;   
    }