Как сделать общий тип, который может быть xml, json или html - PullRequest
0 голосов
/ 22 марта 2019

У меня есть программа, которая в какой-то момент загрузит текстовый файл.Содержимое этого текстового файла будет иметь формат xml, json или html.

Мой текущий подход выглядит следующим образом:

  1. Загрузите файл, проанализируйте его, проверьте, является ли он json,
    Да: сохранить его в предопределенную строку,
    Нет:
  2. Загрузить файл, проанализировать его, проверить, является ли он XML,
    Да: сохранить его в предопределенном XmlDocument,
    Нет:
  3. Загрузить файл, разобрать его, проверить, является ли он html,
    Да: сохранить его в предопределенном HtmlDocument,
    Нет: ошибка

И в концеМне нужно различать.Проверьте все из них.И то, что не равно нулю, будет обрабатываться дальше.

Также мне пришлось создать экземпляр XmlDocument и HtmlDocument следующим образом:

XmlDocument XmlDoc = new XmlDocument();
XmlDoc = null;,

, чтобы убедиться, что они фактически равны нулю при различении вконец.Потому что, если я только построю, они не будут нулевыми.

Это выглядит очень грязно.Я знаю, что могу что-то сделать с интерфейсами и, возможно, с фабрикой.Но что меня смущает: скажем, я создаю интерфейсный документ, разве содержание этой вещи не должно быть универсальным?Я имею в виду, у меня есть разные типы файлов .. Я очень запутался.

1 Ответ

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

Что ж, вы все равно должны проверить эти 3 типа, но, тем не менее, вы можете создать свой собственный класс и реализовать эти проверки и синтаксический анализ внутри своего собственного класса (или интерфейса):

Вы можете создать неявное приведение для всех трех типов, чтобы можно было установить его значение с помощью любого из этих трех типов:

public class MultiDoc
{
     private XmlDocument xml = new XmlDocument();
     private string type = "";
     public void Load(string content)
     {
          //do your checking to match the types here
     }

     public T Get<T>()
     {
          if(typeof(T) == typeof(XmlDocument))
              return xml;
          elseif ...
     }

     //implicit casting type XmlDocument
     public MultiDoc(XmlDocument input) {  xml = input; type = "xml"; }
     public static implicit operator MultiDoc(XmlDocument input) { return new MultiDoc(input); }

    //do same casting for other types.

}

Теперь из-за неявного приведения вы можете просто:

XmlDocument somexml = ....
MultiDoc mc = somexml;  //implicity cast XmlDocument to MultiDoc 

А для получения:

XmlDocument somexml = mc.Get<XmlDocument>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...