如何在C#

时间:2018-07-27 09:43:13

标签: c# web-services soap

我是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;

我在这里错过了哪一步?

1 个答案:

答案 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>();

那是获取数据的方式