Дублировать код из идентичных объектов в отдельных пространствах имен - PullRequest
0 голосов
/ 12 июня 2018

Я пишу консольное приложение, чтобы упростить управление локальным экземпляром SSRS, используя библиотеки ReportExecution2005 и ReportService2010 , каждая из которых предоставляет различные функции.Для работы с существующими отчетами мне нужно прочитать строки XML из базы данных ReportServer, которая содержит параметры отчетов, проанализировать их и использовать эту информацию для построения объектов, используемых при взаимодействии с сервером.Для этого я написал простую функцию, показанную ниже

public static ParameterValue[] RebuildParameters(string parameters) {

        //setup xml
        XDocument main = XDocument.Parse(parameters);
        List<XElement> pElements = main.Descendants("ParameterValue").ToList();

        //rebuild param list
        ParameterValue[] newParams = new ParameterValue[pElements.Count];
        int i = 0;
        foreach (XElement param in pElements) {
            newParams[i] = new ParameterValue();
            newParams[i].Name = param.Element("Name").Value.ToString();
            newParams[i].Value = param.Element("Value").Value.ToString();
            i++;
        }

        return newParams;
}

Все шло хорошо, пока мне не понадобилось использовать эту вспомогательную функцию для двух отдельных пространств имен.Класс ParameterValue существует в обоих пространствах имен ( Здесь и Здесь ), но я не могу явно привести их между собой.Я попытался также настроить универсальную функцию, но я не могу назначить имя или значение, так как тип неизвестен.

public static T[] RebuildParameters<T>(string parameters) where T : new() {
        //setup xml
        XDocument main = XDocument.Parse(parameters);
        List<XElement> pElements = main.Descendants("ParameterValue").ToList();

        //rebuild param list
        T[] newParams = new T[pElements.Count];
        foreach (XElement param in pElements) {
            newParams[i] = new T();
            //not allowed
            newParams[i].Name = param.Element("Name").Value.ToString();
            newParams[i].Value = param.Element("Value").Value.ToString();
        }
        return newParams;
    }

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

1 Ответ

0 голосов
/ 12 июня 2018

Вы правы, что эти типы не могут быть разыграны, потому что они представляют совершенно разные типы.Однако, глядя на них, они кажутся очень простыми объектами, что дает вам возможность отобразить их.Предполагая, что оба они доступны в той же форме, что и связанные документы, вы должны быть в состоянии сделать это:

public ReportService2010.ParameterValue Map(ReportExecution2005.ParameterValue data)
{
    return new ReportService2010.ParameterValue()
    {
        Label = data.Label,
        Name = data.Name,
        Value = data.Value
    };
}

public ReportService2005.ParameterValue Map(ReportExecution2010.ParameterValue data)
{
    return new ReportService2005.ParameterValue()
    {
        Label = data.Label,
        Name = data.Name,
        Value = data.Value
    };
}
...