私は Web サービスを使用しており、サービスからの応答を取得しています。応答の構造は異なります。たとえば、API getInfo の戻り応答は次のとおりです。
{"code":0,"message":"","result":{"nickname":"UserName","age":"22"}}
API サインイン:
{"code":0,"message":"","result":"user_token"}
などHttpWebRequest
POSTリクエストに使用します。でリクエストとレスポンスをデシリアライズ/シリアライズしDataContractSerializer
ます。
だから、私はファクトリパターンを使いたい、これが私の実装です:
[DataContract]
public class ResultGetInfo
{
[DataMember(Name = "nickname")]
public int Nickname { get; set; }
[DataMember(Name = "age")]
public int Age { get; set; }
}
[DataContract]
public abstract class Response
{
}
[DataContract]
public class ResponseSignin : Response
{
[DataMember(Name = "code")]
public int Code { get; set; }
[DataMember(Name = "message")]
public string Message { get; set; }
[DataMember(Name = "result")]
public string Result { get; set; }
}
[DataContract]
public class ResponseGetInfo : Response
{
[DataMember(Name = "code")]
public int Code { get; set; }
[DataMember(Name = "message")]
public string Message { get; set; }
[DataMember(Name = "result")]
public ResultGetInfo Result { get; set; }
}
public abstract class CreateResponse
{
public abstract Response CreateResponseObj();
}
public class CreateResponseSignin : CreateResponse
{
public override Response CreateResponseObj()
{
return new ResponseSignin();
}
}
public class CreateResponseGetInfo : CreateResponse
{
public override Response CreateResponseObj()
{
return new ResponseGetInfo();
}
}
コールバック関数で応答を取得します:
private void getResponseCallback(IAsyncResult asynchronousResult)
{
var request = (Request)asynchronousResult.AsyncState;
try
{
HttpWebResponse response;
// End the get response operation
response = (HttpWebResponse)request.HttpRequest.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamReader = new StreamReader(streamResponse);
var gyResponse = streamReader.ReadToEnd();
streamResponse.Close();
streamReader.Close();
response.Close();
Response response_obj = request.Creater.CreateResponseObj();
using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(gyResponse)))
{
var serializer = new DataContractJsonSerializer(response_obj.GetType());
response_obj = (Response)serializer.ReadObject(stream);
if (request.CallBack != null)
{
request.CallBack.Invoke(response_obj, null);
}
}
}
catch (WebException e)
{
if (request.CallBack != null)
{
request.CallBack.Invoke(null, e);
}
}
}
ここDataContractJsonSerializer
で型を宣言します。
var serializer = new DataContractJsonSerializer(response_obj.GetType());
response_obj
必要な型 (ResponseSignin
または) を持つオブジェクトはどこにありますかResponseGetInfo
。
それで、私Invoke()
は代理人を呼びます。
private void ResponseHandler(Response result, Exception error)
{
if (error != null)
{
string err = error.Message;
}
else
{
Response response = result;
}
}
そして、ここで問題があります。変数result
には本当に正解が含まれていますが、抽象クラスにはプロパティがないため、プロパティを取得できませんResponse
。また、派生クラスでプロパティを宣言したり、オーバーライドしたりすることはできません。希望のパターンを選択したかどうかはわかりません。