Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 工厂模式实施中的问题_C#_Json_Httpwebrequest_Factory Pattern - Fatal编程技术网

C# 工厂模式实施中的问题

C# 工厂模式实施中的问题,c#,json,httpwebrequest,factory-pattern,C#,Json,Httpwebrequest,Factory Pattern,我使用web服务,并从服务获得响应。响应将具有不同的结构。例如,API getInfo返回响应: {"code":0,"message":"","result":{"nickname":"UserName","age":"22"}} API签名: {"code":0,"message":"","result":"user_token"} 等等。 我使用HttpWebRequest进行POST请求。请求和响应使用DataContractSerializer反序列化/序列化 所以,我想使用工厂模

我使用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\u obj
是对象,它具有所需的类型(
ResponseSignin
ResponseGetInfo

因此,我在委托中调用
Invoke()

private void ResponseHandler(Response result, Exception error)
{
    if (error != null)
    {
        string err = error.Message;
    }
    else
    {
        Response response = result;
    }
}

这里我有个问题。变量
result
确实包含正确的答案,但我没有得到属性,因为抽象类
Response
没有属性。我不能在派生类中声明属性或重写。我不确定是否选择了所需的模式。

您是否尝试将
结果
变量强制转换为所需的类型

例如


非常感谢。目前,这是我能实现的最佳解决方案:)
private void ResponseHandler(Response result, Exception error)
{
    if (error != null)
    {
        string err = error.Message;
        return;
    }

    var signInResponse = result as ResponseSignin;
    if (signInResponse != null)
    {
        HandleSignInResponse(signInResponse);
    }

    var infoResponse = result as ResponseGetInfo;
    if (infoResponse != null)
    {
        HandleInfoResponse(infoResponse);
    }
}