2016-08-03 29 views
0

我有以下的C#代码,我已经在我的代码中重新使用了大约20次。我无法弄清楚如何使它成为一个子程序,这将允许我重新使用它的B/C类型的对象每次都基于不同的类。如何使用此C#代码创建子例程?

该代码的目的是发送一个HTTP请求,收集JSON响应,然后将JSON序列化(使用DataContract)到一个类中以用于其他区域。

这里就是我的了:这一特定用途

public static ResponseAttachmentIds MakeRequestAttachmentId(string requestUrl, string strToken) 
    { 
     try 
     { 
      HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest; 
      request.Headers["Authorization"] = "OAuth " + strToken; 
      using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
      { 
       if (response.StatusCode != HttpStatusCode.OK) 
        throw new Exception(String.Format(
        "Server error (HTTP {0}: {1}).", 
        response.StatusCode, 
        response.StatusDescription)); 
       DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(ResponseAttachmentIds)); 
       object objResponse = jsonSerializer.ReadObject(response.GetResponseStream()); 
       ResponseAttachmentIds jsonResponse = objResponse as ResponseAttachmentIds; 
       response.Close(); 
       return jsonResponse; 
      } 
     } 
     catch (Exception e) 
     { 
      System.Windows.Forms.MessageBox.Show(e.Message); 
      return null; 
     } 

    } 

的DataContract类:

public class ResponseAttachmentIds 
{ 
    [DataMember(Name = "done")] 
    public bool attachmentIds_done; 
    [DataMember(Name = "records")] 
    public List<ResponseAttachmentId> attachmentIds_records; 
} 
[DataContract] 
public class ResponseAttachmentId 
{ 
    [DataMember(Name = "Id")] 
    public string attachmentId_strId { get; set; } 
    [DataMember(Name = "Image_Attachment_Id__c")] 
    public string attachmentId_strAttachmentId { get; set; } 
} 

的问题是,我也有这个相同的设置约20个不同的类如ResponseImages,ResponseProperties,ResponseProperty

任何帮助吗?

+2

除了托尼和保罗的答案,我建议'DataContractJsonSerializer'是相当有限的。你可能想看看NewtonSoft的Json串行器(你可以在Nuget上找到它) –

回答

2

我相信你想要的是一个通用的方法,例如:

public static T MakeRequestAttachmentId<T>(string requestUrl, string strToken) where T : class 
    { 
     try 
     { 
      HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest; 
      request.Headers["Authorization"] = "OAuth " + strToken; 
      using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
      { 
       if (response.StatusCode != HttpStatusCode.OK) 
        throw new Exception(String.Format(
        "Server error (HTTP {0}: {1}).", 
        response.StatusCode, 
        response.StatusDescription)); 
       DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T)); 
       object objResponse = jsonSerializer.ReadObject(response.GetResponseStream()); 
       var jsonResponse = (T)objResponse; 
       response.Close(); 
       return jsonResponse; 
      } 
     } 
     catch (Exception e) 
     { 
      System.Windows.Forms.MessageBox.Show(e.Message); 
      return default(T); 
     } 

    } 

而且你可以把它作为这样的:

MakeRequestAttachmentId<ResponseAttachmentIds>("", ""); 
+0

这个工作完美!万分感谢! – gotmike

2

我会改变使用泛型方法。像...

public static T MakeResponseObject<T>(string requestUrl, string strToken) 
{ 
    try 
    { 
     HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest; 
     request.Headers["Authorization"] = "OAuth " + strToken; 
     using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
     { 
      if (response.StatusCode != HttpStatusCode.OK) 
       throw new Exception(String.Format(
       "Server error (HTTP {0}: {1}).", 
       response.StatusCode, 
       response.StatusDescription)); 
      DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T)); 
      object objResponse = jsonSerializer.ReadObject(response.GetResponseStream()); 
      var jsonResponse = objResponse as T; 
      response.Close(); 
      return jsonResponse; 
     } 
    } 
    catch (Exception e) 
    { 
     System.Windows.Forms.MessageBox.Show(e.Message); 
     return null; 
    } 
} 
+0

感谢您的回应,您几乎在同一时间给予几乎与另一位用户相同的回应。我给出了另一个B/C的答案,我认为以'DataContractJsonSerializer'开始的行中有一个错误,而另一个用户给了我这个用法。 – gotmike

+0

@gotmike无后顾之忧。在其他消息中,我会小心地将响应JSON转换为泛型类型T,以防对象在更新源代码时发生变化。这就是为什么我使用“as”关键字代替。微小的差异,但可能会对您的代码处理更新的能力产生重大影响。 –