我正在编写一个控制台应用程序,以便使用每个提供不同功能的ReportExecution2005和ReportService2010库来更轻松地管理本地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类存在于两个名称空间(Here和Here)中,但我无法在它们之间显式转换。我也尝试过设置泛型函数,但由于类型未知,我无法分配名称或值。
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;
}
编写单个辅助方法的最佳方法是什么,可以由来自不同命名空间的两个类使用,知道代码是相同的?
答案 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
};
}