我是c#的新手,尝试使用SOAP Web服务,我生成了对WSDL的服务引用,并且能够执行以下操作来检索响应的数据集。
SportingGatewaySoapClient myServices = new SportingGatewaySoapClient("GatewaySoapID");
RSportResults sportsResults = myServices.SportResults("username","password");
System.Data.DataSet dataSet = sportsResults.dsSportResults;
如果像通常那样遍历数据集,我就能看到正确的信息:
foreach (DataTable table in dataSet.Tables)
{
foreach (DataRow row in table.Rows)
{
foreach (object item in row.ItemArray)
{
Console.WriteLine(item);
}
}
}
但是我看不到如何将数据直接解组到生成的类中,因此我可以按名称引用其属性。例如:
// some code here to convert response to a Sport object
sport.getSportName()
自动生成的Reference.cs文件具有这样的类:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.7.3056.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="https://endpointurl")]
public partial class RSport : object, System.ComponentModel.INotifyPropertyChanged {
private string sportName;
我在这里错过了哪一步?
答案 0 :(得分:1)
您的WCF返回一个DataSet
,其中包含RSport
个对象。
因此,为DataTable
创建扩展名的想法。使用Reflection
的扩展名会将每一行转换为给定类型的实例
public static class DataTableExtensions
{
public static IList<T> ToList<T>(this DataTable table) where T : new()
{
IList<PropertyInfo> properties = typeof(T).GetProperties().ToList();
IList<T> result = new List<T>();
foreach (var row in table.Rows)
{
var item = CreateItemFromRow<T>((DataRow)row, properties);
result.Add(item);
}
return result;
}
private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new()
{
T item = new T();
foreach (var property in properties)
{
property.SetValue(item, row[property.Name], null);
}
return item;
}
}
接下来,您将像这样转换数据表
System.Data.DataSet dataSet = sportsResults.dsSportResults;
var rs = dataSet.Tables[0].ToList<RSport>();
那是获取数据的方式