返回特定对象类的泛型方法

时间:2019-03-16 16:36:10

标签: c# json json.net

我想提出一个向我返回JSON的webrequest。取决于我在参数中引入的URL,此json的结构不同。然后我反序列化对象,然后将此数据分配给特定对象。我的问题是:

如果我想创建一个根据URL返回一个对象的方法,我必须定义哪种类型的参数?

例如:

public objectdependsofURL RequestWeb(string URL)
{
    objectdependsofURL data = new objectdependsofURL();
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

    using (HttpWebResponse Response = (HttpWebResponse)request.GetResponse())
    using (Stream stream = Response.GetResponseStream())
    using (StreamReader reader = new StreamReader(stream))
    {
        var json = reader.ReadToEnd();
        data = JsonConvert.DeserializeObject<objectdependsofURL>(json);
    }

    return data;
}

主要思想不是为每个URL定义一个方法,而是我之前创建的。 我希望问题清楚。我尝试了一个类对象,但这也许不是答案。 当我生成URL时,我知道将与之对应的对象是什么,但是在创建方法时,如何定义依赖于URL的对象?

2 个答案:

答案 0 :(得分:0)

您要做的就是使方法签名具有通用性。

public objectdependsofURL RequestWeb<objectdependsofURL>(string URL) where objectdependsofURL : new()

在方法的第一行中创建实例时,确实需要添加一个约束,该类型必须具有公共无参数构造函数。


作为一个旁注和一个优先考虑的问题,我将更改以pascal大小写而不是驼峰大小写的泛型的名称。

答案 1 :(得分:0)

我想到了一些事情:

1)就像Crowcoder和Igor所说的那样,如果调用方法知道结果类型,则可以将其转换为简单的通用方法

public T RequestWeb<T>(string URL) where T: new()

2)如果调用方法不知道结果类型,则可以尝试使用一种方法将基类添加到json结果类型中:

abstract class BaseClass 
{
    public T Get<T>(string name)
    {
        // Do appropriate error handling here (wrong name, wrong case, sub-nodes, ...)
        var field = GetType().GetField(name);
        return (T)field.GetValue(this);
    }
}

public class YourConcreteJsonResultType: BaseClass
{
    public int JsonVarName;
}

public BaseClass RequestWeb(string URL)
{
    //...
}

BaseClass x = RequestWeb("someurl.html");
int y = x.Get<int>("JsonVarName");

3)如果调用方法不知道结果类型,并且您不想使用基类,则可以考虑使用dynamic数据类型。 可以,但是当您使用此方法时,您肯定会发现这不是最佳选择 ;)

public dynamic RequestWeb(string URL)
{
    //...
}

var x = RequestWeb("someurl.html");
var y = x.JsonVarName;

据我所知,您无需创建objectdependsofURL类型的实例,因为JsonConvert.DeserializeObject<objectdependsofURL>(json);创建了自己的实例。