2016-08-03 12 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異なるため、これと同じセットアップをも持っているということである。ここ

は、私が持っているものですクラスResponseImagesResponsePropertiesResponsePropertyなど

どのようなヘルプ?

+2

Tony&Paulの回答に加えて、私は '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

私はジェネリックを使用する方法を変更します。何かが好きです...

+0

お返事ありがとうございました。あなたはほぼ同じ時刻に他のユーザーとほぼ同じ反応を出しました。私は他の人に答えを与えました。私は、 'DataContractJsonSerializer'で始まる行にエラーがあり、他のユーザが私に使い方を教えてくれたと思います。 – gotmike

+0

@gotmike心配する必要はありません。他のニュースでは、ソースを更新せずにオブジェクトが変更された場合にJSONをジェネリック型Tにキャスティングすることに注意します。これが、代わりに "as"キーワードを使用した理由です。マイナーな違いですが、コードの更新処理能力に大きな影響を与える可能性があります。 –

関連する問題