Задайте Action <T>callback как данные с xml, возможно, с атрибутом cref? - PullRequest
1 голос
/ 08 марта 2019

У меня есть файл определений 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;   
    }
}

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

Я где-то видел несколько связанных обсуждений, которые можно было бы сделать с отражением, сохраняя CallbackClass и CallbackMethod в виде строк. Это похоже на очень окольный подход.

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

1 Ответ

0 голосов
/ 08 марта 2019

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

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

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

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

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

Например:

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