【问题标题】:Pass a type as parameter to method将类型作为参数传递给方法
【发布时间】:2015-12-26 01:05:20
【问题描述】:

我有一个班级叫RootObject

public class RootObject
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Address { get; set; }
}

public void getdata()
{
    WebRequest request = WebRequest.Create("http://addresstojson.com/json.json");
    WebResponse response = await request.GetResponseAsync();

    using (var stream = new StreamReader(response.GetResponseStream()))
    {
       json = JsonConvert.DeserializeObject<RootObject>(stream.ReadToEnd());
    }
}

getdata()方法的最后一条语句中,传入了类型:

JsonConvert.DeserializeObject</*here*/>(Stream.ReadToEnd())

我想将类型作为参数传递给getdata(RootObject) 方法。

有没有办法在 C# 中使用泛型来做到这一点?

【问题讨论】:

标签: c#


【解决方案1】:

实现强类型反序列化的标准方法是这样的:

public T Get<T>()
{
    string json = ...; // get data somehow
    return JsonConvert.DeserializeObject<T>(json);
}

看起来您想异步读取结果,因此您需要将结果实际返回为Task&lt;T&gt;,以及使用读取数据的方法的xxxxAsync 版本:

public Task<T> GetData<T>()
{
    WebRequest request = WebRequest.Create("http://addresstojson.com/json.json");
    using (WebResponse response = await request.GetResponseAsync())
    {
        using(var stream = new StreamReader(response.GetResponseStream()))
        {
            string json = await stream.ReadToEndAsync();
            T result = JsonConvert.DeserializeObject<T>();
            return result;
        }
    }
}

您可以在此处了解有关泛型的更多信息:https://msdn.microsoft.com/en-us/library/512aeb7t.aspx

【讨论】:

  • 无法将 Type T 隐式转换为 RootObject。
  • 你到底想做什么?
  • 非常感谢。我找到了答案
  • @DmytroShevchenko 我已经“稍微”更改了您的答案,以使代码更有可能编译和集成 OP 关于异步的评论。随意回滚/改进。
【解决方案2】:
public static async Task<T> GetData<T>(string add)
    {
        WebRequest request = WebRequest.Create(add);
        WebResponse response = await request.GetResponseAsync();

        using (var stream = new StreamReader(response.GetResponseStream()))
        {
            return JsonConvert.DeserializeObject<T>(stream.ReadToEnd());
        }
    }

【讨论】:

  • 您能否澄清一下为什么这与之前的答案不同/更好?看起来与其他答案相同(添加了 async,这显然不是原始问题的一部分)。
  • 对不起,我忘记在问题中写async。当我应用@Dmytro Shevchenko 给我的答案时。它向我显示了这个错误。**无法将 Type T 隐式转换为 RootObject。**。在答案几乎没有变化之后。有效。我在这个链接中找到了答案。 Answer
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多