2017-02-27 12 views
5

Vì vậy, tôi đang sử dụng CookComputings XMLRPC thư viện để có thể nói chuyện với InfusionSoft (nó là một CRM trực tuyến đó là khá phổ biến). Phương pháp chính là:Chuyển đổi CookComputing XMLRpcStruct (IEnumerable <Object>) đến một thực tế C# lớp

[XmlRpcMethod("DataService.query")] 
IEnumerable<object> QuerySubscriptionStatus(string apiKey, 
     string table, int limit, int page, 
     IDictionary queryData, string[] selectedFields); 

Tôi yêu cầu phải sử dụng một IEnumerable<object> buồn bã, như InfusionSoft XML/RPC API đòi hỏi nó. Tôi ước nó không phải như vậy, nhưng thật đáng buồn.

Kể từ khi tôi sử dụng .NET 4.5, tôi figured Tôi chỉ có thể làm một dàn diễn viên dyanmic:

var subStatus = proxy.QuerySubscriptionStatus(
     _key, "RecurringOrder", 500, 0, dict, sarray); 
    var result = subStatus.Cast<SubscriptionStatus>(); 

Thật không may, điều này không làm việc, tôi được đưa ra một lỗi rất khó chịu từ C#:

Không thể cast đối tượng của loại 'CookComputing.XmlRpc.XmlRpcStruct' gõ 'WBI.Model.SubscriptionStatus'.`

tôi đã cố gắng xác định lớp của tôi như là một struct; heck Tôi thậm chí đã cố gắng xác định nó với các thẻ XMLRpcMember(), nhưng không, nó chỉ sẽ không chuyển đổi.

Làm cách nào để tương tác với dữ liệu trong IEnumerable?

Lớp/Struct loại Tôi đã thử

public struct SubStatus 
{ 
    public int AffiliateId; 
    public int AutoCharge; 
    public double BillingAmt; 
    public string BillingCycle; 
    public int CC1; 
    public int CC2; 
    public int ContactId; 
    public DateTime EndDate; 
    public int Frequency; 
    public int Id; 
    public DateTime LastBillDate; 
    public int LeadAffiliateId; 
    public int MaxRetry; 
    public int MerchantAccountId; 
    public DateTime NextBillDate; 
    public int NumDaysBetweenRetry; 
    public int OriginatingOrderId; 
    public DateTime PaidThruDate; 
    public int PaymentGatewayId; 
    public int ProductId; 
    public int ProgramId; 
    public string PromoCode; 
    public int Qty; 
    public string ReasonStopped; 
    public int ShippingOptionId; 
    public DateTime StartDate; 
    public string Status; 
    public int SubscriptionPlanId; 
} 

Tôi cũng chỉ cố gắng một lớp đơn giản với XMLRpcMember tags:

public class SubscriptionStatus 
{ 
    [XmlRpcMember("AffiliateId")] 
    public int AffiliateId { get; set; } 
    [XmlRpcMember("AutoCharge")] 
    public int AutoCharge { get; set; } 
    [XmlRpcMember("BillingAmt")] 
    public double BillingAmt { get; set; } 
    [XmlRpcMember("BillingCycle")] 
    public string BillingCycle { get; set; } 
    [XmlRpcMember("CC1")] 
    public int CC1 { get; set; } 
    [XmlRpcMember("CC2")] 
    public int CC2 { get; set; } 
    [XmlRpcMember("ContactId")] 
    public int ContactId { get; set; } 
    [XmlRpcMember("EndDate")] 
    public DateTime EndDate { get; set; } 
    [XmlRpcMember("Frequency")] 
    public int Frequency { get; set; } 
    [XmlRpcMember("Id")] 
    public int Id { get; set; } 
    [XmlRpcMember("LastBillDate")] 
    public DateTime LastBillDate { get; set; } 
    [XmlRpcMember("LeadAffiliateId")] 
    public int LeadAffiliateId { get; set; } 
    [XmlRpcMember("MaxRetry")] 
    public int MaxRetry { get; set; } 
    [XmlRpcMember("MerchantAccountId")] 
    public int MerchantAccountId { get; set; } 
    [XmlRpcMember("NextBillDate")] 
    public DateTime NextBillDate { get; set; } 
    [XmlRpcMember("NumDaysBetweenRetry")] 
    public int NumDaysBetweenRetry { get; set; } 
    [XmlRpcMember("OriginatingOrderId")] 
    public int OriginatingOrderId { get; set; } 
    [XmlRpcMember("PaidThruDate")] 
    public DateTime PaidThruDate { get; set; } 
    [XmlRpcMember("PaymentGatewayId")] 
    public int PaymentGatewayId { get; set; } 
    [XmlRpcMember("ProductId")] 
    public int ProductId { get; set; } 
    [XmlRpcMember("ProgramId")] 
    public int ProgramId { get; set; } 
    [XmlRpcMember("PromoCode")] 
    public string PromoCode { get; set; } 
    [XmlRpcMember("Qty")] 
    public int Qty { get; set; } 
    [XmlRpcMember("ReasonStopped")] 
    public string ReasonStopped { get; set; } 
    [XmlRpcMember("ShippingOptionId")] 
    public int ShippingOptionId { get; set; } 
    [XmlRpcMember("StartDate")] 
    public DateTime StartDate { get; set; } 
    [XmlRpcMember("Status")] 
    public string Status { get; set; } 
    [XmlRpcMember("SubscriptionPlanId")] 
    public int SubscriptionPlanId { get; set; } 
} 

Trả lời

1

Vì vậy, sau khi một số giúp đỡ mở rộng từ một nhà phát triển cấp cao, nó quay ra chúng tôi có thể thực hiện một số thay đổi đối với cấu trúc:

private string[] retFlds = { "Id", "ContactId", "OriginatingOrderId", "ProgramId", "SubscriptionPlanId", "ProductId", "StartDate", "NextBillDate", "BillingCycle", "Frequency", "BillingAmt", "Status", "ReasonStopped", "AutoCharge", "CC1", "CC2", "NumDaysBetweenRetry", "MaxRetry", "MerchantAccountId", "AffiliateId", "PromoCode", "LeadAffiliateId", "Qty", "ShippingOptionId" }; 
    private string table = "RecurringOrder"; 
    private DataTable dt = new DataTable(); 
    // here's the query 
    XmlRpcStruct[] retData = proxy.Query(Auth.key, table, 1000, 0, qryData, returnFields); 
    dt = StructArrayToDT(retData); 

    public static DataTable StructArrayToDT(XmlRpcStruct[] data) 
    { 
     DataTable dt = new DataTable(); 
     if (data.Length == 0) { return dt; } 

     // do columns 
     foreach (DictionaryEntry d in data[0]) 
     { 
      dt.Columns.Add(d.Key.ToString(), typeof(object)); 
     } 

     foreach (XmlRpcStruct xmlstruct in data) 
     { 
      DataRow dr = dt.NewRow(); 
      foreach (DictionaryEntry d in xmlstruct) 
      { 
       try 
       { 
        dr[d.Key.ToString()] = d.Value; 
       } 
       catch (Exception ex) 
       { 
        // handle errors 
       } 

      } 
      dt.Rows.Add(dr); 
     } 
     return dt; 
    } 

Cuối cùng có thể truy cập vào dữ liệu mà không có bất kỳ vấn đề bây giờ.

0

Nhìn vào chữ ký của QuerySubscriptionStatus trở về IEnumerable của nó. Một lần nữa nếu bạn nhìn vào định nghĩa của XmlRpcStruct (Fork of XML.Rpc.Net) đang triển khai IDictionary, ICollection, IEnumerable. Vì vậy, nếu chúng ta giả định rằng QuerySubscriptionStatus đang trả về XmlRpcStruct để triển khai thực hiện IEnumerable thì bạn đang nhận được Enumeration trong response mà chủ yếu là tập hợp các mục (ngay cả khi nó chứa một mục). Bạn đang cố gắng để định kiểu liệt kê cấu trúc (SubscriptionStatus) mà không phải là bộ sưu tập. Do đó lỗi. Nếu các mục có trong Liệt kê thuộc loại cấu trúc SubscriptionStatus thì dòng sau đây nên làm thủ thuật.

var resultList = subStatus.ToList<SubscriptionStatus(); 

và sau đó lặp qua kết quảDanh sách để truy cập phản hồi từ phương thức QuerySubscriptionStatus.

foreach(var result in resultList) 
{ 

} 

HOẶC nếu bạn chắc chắn rằng danh sách trả lời sẽ có mục duy nhất sau đó bạn cũng có thể sử dụng sau

var result = resultList.FirstOrDefault(); 

Hy vọng rằng sẽ giúp.

+0

Rất tiếc, không thể truyền danh sách đó vào Danh sách vì IEnumerable không cho phép. Đây là một hành trình khó chịu lol cảm ơn bạn đã đề xuất mặc dù :) 'Thông báo lỗi trình biên dịch: CS1929: 'IEnumerable ' không chứa định nghĩa cho 'ToList' và phương thức mở rộng tốt nhất quá tải 'Enumerable.ToList (IEnumerable ) 'yêu cầu người nhận kiểu' IEnumerable '' – zackrspv

Các vấn đề liên quan