2016-08-03 1 views
0

J'ai le code C# suivant et je l'ai réutilisé environ 20x dans mon code. Je n'arrive pas à comprendre comment en faire un sous-programme qui me permettrait de le réutiliser b/c du type d'objet est basé sur une classe différente à chaque fois.Comment puis-je créer un sous-programme avec ce code C#?

Le but du code est d'envoyer une requête HTTP, de recueillir la réponse JSON, puis de sérialiser JSON (en utilisant un DataContract) dans une classe pour l'utiliser dans d'autres zones.

Voici ce que j'ai:

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; 
     } 

    } 

Les classes DataContract pour cette utilisation particulière sont:

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; } 
} 

Le problème est que j'ai aussi cette même configuration pour environ 20 différents classes comme ResponseImages, ResponseProperties, ResponseProperty, etc.

Une aide?

+2

En plus des réponses de Tony et Paul, je suggère que 'DataContractJsonSerializer' est assez limité. Vous pouvez vérifier Json Serializer de NewtonSoft (vous pouvez le trouver sur Nuget) –

Répondre

2

Je crois que ce que vous voulez est une méthode générique en tant que tel:

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); 
     } 

    } 

Et vous pouvez l'appeler comme tel:

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

cela a fonctionné parfaitement! Merci beaucoup! – gotmike

2

je changerais la méthode à utiliser les médicaments génériques. Quelque chose comme ...

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

merci pour la réponse, vous avez donné pratiquement la même réponse qu'un autre utilisateur presque à la même heure. J'ai donné la réponse à l'autre b/c je pense qu'il y a une erreur dans la ligne qui commence par 'DataContractJsonSerializer' et l'autre utilisateur m'a donné l'utilisation. – gotmike

+0

@gotmike Pas de soucis. Dans d'autres nouvelles, je ferais attention à transtyper la réponse JSON au type générique T au cas où l'objet changerait jamais sans que vous mettiez à jour votre source. C'est pourquoi je suis allé à l'aide du mot-clé "as" à la place. Différence mineure, mais impact potentiellement important sur la capacité de votre code à gérer les mises à jour. –