2016-08-03 3 views
0

У меня есть следующий код C#, и я повторно использовал его около 20x в моем коде. Я не могу понять, как сделать это в подпрограмме, которая позволила бы мне повторно использовать его. 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' довольно ограничен. Вы можете проверить Json Serializer от NewtonSoft (вы можете найти его на 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 в случае, если объект будет изменяться без обновления вашего источника. Вот почему я пошел использовать ключевое слово «как». Малая разница, но потенциально большое влияние на способность вашего кода обрабатывать обновления. –

Смежные вопросы