我想提出一个向我返回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的对象?
答案 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);
创建了自己的实例。