Как создать класс (ы) Parameter для передачи в пользовательские классы отчетов? - PullRequest
0 голосов
/ 02 ноября 2010

Я работаю с пользовательским механизмом отчетов, который использует XML и XSL для вывода данных отчета в браузер.Каждый отчет может иметь несколько параметров различных типов значений (целые числа, строки, даты).

Каждый отчет имеет свой собственный класс (унаследованный от базового класса отчета) и XSLT, который получает данные из БД на основе параметров, генерирует XML и стилизует его с помощью XSLT.Однако в настоящее время параметры перечислены индивидуально в каждом классе.Я думаю, что более эффективно создать класс Parameter, иметь общий список всех параметров, добавлять параметры в список при запросе данных отчета, тогда базовый класс может циклически проходить по списку параметров и выводить соответствующий XML,

Вот как теперь выглядит код:

public class Report
{
    //Common functions used by all reports
}

public class OrderDetailReport : Report
{
    public long? Parameter1 { get; set; }
    public long? Parameter2 { get; set; }

    public XElement CreateXML()
    {
        var xml = new XElement();

        xml.Add(GetXMLParameters());

        //Get Data and generate XML

        return xml;
    }

    public XElement GetXMLParameters()
    {
        var parameters = new XElement("Parameters",
                            new XElement("Parameter",
                                    new XAttribute("Name", "Parameter1"),
                                    new XAttribute("Value", Parameter1)),
                            new XElement("Parameter",
                                    new XAttribute("Name", "Parameter2"),
                                    new Attribute("Value", Parameter2)));
        return parameters;
    }
}

Как должен выглядеть класс Parameter, чтобы он мог обрабатывать все различные типы значений и иметь возможность форматировать значение, котороеотображается на экране?

РЕДАКТИРОВАТЬ:

Я хочу иметь возможность переместить функцию GetXMLParameters() в базовый класс и получить список что-то вроде List<Parameter> в базе, через которую GetXMLParameters() будет проходить цикл и создавать XML.

Это позволит избежать GetXMLParameters() в каждом CustomReport классе.

Спасибо.Я надеюсь, что это было ясно.
Оран

Ответы [ 2 ]

1 голос
/ 02 ноября 2010

взгляните на сериализацию.В .net есть много сериализаторов xml (wcf, xml и т. Д.), Которые преобразуют ваши объекты для вас.Вы также можете сформировать вывод xml, используя атрибуты для членов, которые вы хотите сериализовать.

Я предлагаю это решение, потому что, пока ваш класс может быть сериализован, он всегда будет работать и обеспечивать дальнейший рост.

ЗАПРОШЕНО:

public static class SerialiserHelper
{
        public static string Serialize(this object @object)
        {
            try
            {

               DataContractSerializer serializer = new DataContractSerializer(@object.GetType());


                using (MemoryStream memoryStream = new MemoryStream())
                {

                    serializer.WriteObject(memoryStream, @object);

                    var encoder = new System.Text.UTF8Encoding(false);

                    return encoder.GetString(memoryStream.GetBuffer(), 0, Convert.ToInt32(memoryStream.Length));
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }



        public static T DeSerialize<T>(this string serializedObject)
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(T));

            var encoder = new System.Text.UTF8Encoding(false);

            using (var memoryStream = new MemoryStream(encoder.GetBytes(serializedObject)))
            {   
                return (T)serializer.ReadObject(memoryStream);
            }
        }
0 голосов
/ 02 ноября 2010

Посмотрите на отражение:)

http://msdn.microsoft.com/fr-fr/library/system.reflection.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...