来自不同命名空间中相同对象的重复代码

时间:2018-06-12 14:31:50

标签: c# sql-server reporting-services

我正在编写一个控制台应用程序,以便使用每个提供不同功能的ReportExecution2005ReportService2010库来更轻松地管理本地SSRS实例。要使用现有报告,我必须从ReportServer数据库中读取XML字符串,该数据库包含报告参数,解析它们,并使用此信息构建与服务器通信时使用的对象。为此,我写了一个简单的函数,如下所示

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类存在于两个名称空间(HereHere)中,但我无法在它们之间显式转换。我也尝试过设置泛型函数,但由于类型未知,我无法分配名称或值。

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 :(得分:1)

你是正确的,因为它们代表完全不同的类型,所以不能转换这些类型。但是,在查看它们之后,它们看起来就像是非常简单的对象,可以让您选择映射它们。假设两者都以相同的形式提供给您,链接的文档表明您应该能够这样做:

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
    };
}