使用其构造函数和从序列化流返回的对象在初始化时填充对象

时间:2014-05-20 17:12:06

标签: c# .net

我正在为静态API(Jenkins CI)编写一个包装器,我正在尝试通过将函数写入对象来处理通过.Net System.Net.WebResponse接收的序列化对象,让我的生活更轻松用于执行WebRequest并获取对象的类。这工作正常,直到我想在其构造函数中初始化对象的实例。这就是我的意思:

[DataContract]
public class ApiData
{
    public ApiData(string url)
    {
       // Assignment of object instance here 
    }

    [DataMember]
    public List<object> actions { get; set; }
    [DataMember]
    public string description { get; set; }
    [DataMember]
    public string displayName { get; set; }
    ...
    [DataMember]
    public List<object> upstreamProjects { get; set; }

    public ApiData get_job_data(string url)
    {
        var request = WebRequest.Create(url);
        var response = request.GetResponse();

        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ApiData));
        return (ApiData)serializer.ReadObject(response.GetResponseStream());
    }
}

然后,当我实例化下面的对象时,我将只在一行中有一个完全初始化的对象。

        string job_url = "http://apihost.com/dir/job/api/json";
        ApiData job_data = new ApiData(job_url);

我知道我可以将返回的序列化对象中的每个属性分配给实例的每个属性,但是属性列表很长,并且这个工作将重复多个类。我想做什么?我错过了一些基本的东西吗?

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您需要的是通用的反序列化方法。您可以做的是编写一个带有Generic参数的T方法,您可以调用所有要反序列化的对象。

可能看起来像这样:

public static class RequestDeserializer
{
    public static T SendRequestAndDeserialize<T>(string url) where T : new()
    {
        var request = WebRequest.Create(url);
        var response = request.GetResponse();

        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        return (T)serializer.ReadObject(response.GetResponseStream());
    }
}

然后像这样调用它:

var myDeserializedObject = RequestDeserializer.SendRequestAndDeserialize<ApiData>(url);

当然,此示例不包括必须考虑的Exception处理,当然还有系统的体系结构,这可能更适合您代码的Data Access Layer

我建议调查Json.NET因为它更容易处理JSON数据:)

答案 1 :(得分:0)

所以在考虑之后,我基本上试图return a value to a new object using the object's constructor,这只是愚蠢的。我还试图通过减少

来保存只有一行
ApiData job_data = new ApiData();
job_data = ApiData.get_job_data(job_url);
// get_job_data() only exists really to save time writing out the webrequest,
// so I included it as a class method

ApiData job_data = new ApiData(job_url);

这是微不足道的。当我打电话给我时,我很可能只关心一两个值,所以我不会节省很多时间。这是我在StackOverflow上的第一个问题,所以在问之前我会尝试多思考一下。谢谢,Yuval Itzchakov,你的回答。