C #: how to accept two common parameters

I have a function that I want to convert below Ping and Pong to a generic type. Is it possible?

private Pong ReadDataFromApi(string url, Ping data)
{
    string url = "URL_TO_HIT";

    WebResponse response = Util.SendWebRequest<Ping>(url, data, 30000);

    var res = new Pong();
    if (response != null)
    {
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            var objText = reader.ReadToEnd();
            res = JsonConvert.DeserializeObject<Pong>(objText);
        }
    }
    return res;
}

I could convert something below:

private T ReadDataFromApi(string url, T data)  T : class
{
    string url = "URL_TO_HIT";

    WebResponse response = Util.SendWebRequest<T>(url, data, 30000);

    var res = new Pong();
    if (response != null)
    {
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            var objText = reader.ReadToEnd();
            res = JsonConvert.DeserializeObject<Pong>(objText);
        }
    }
    return res;
}

Not sure how to accept Pong as a general parameter.

+4
source share
5 answers

Something like this should work:

private TPong ReadDataFromApi<TPing, TPong>(string url, TPing data)
    where TPing : class
    where TPong : class,new() //You need to create instances of TPong
{
    WebResponse response = Util.SendWebRequest<TPing>(url, data, 30000);

    var res = new TPong(); //Create instance of TPong
    if (response != null)
    {
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            var objText = reader.ReadToEnd();
            res = JsonConvert.DeserializeObject<TPong>(objText);
        }
    }

    return res;
}
+7
source

you can use it like this:

private TPong ReadDataFromApi<TPing,TPong>(string url, TPing data) 
        where TPing : class 
        where TPong : class, new()
+1
source

:

private TPong ReadDataFromApi<TPong, TPing>(string url, TPing data)  TPong : class, new() where TPing : class
{
    string url = "URL_TO_HIT";
    WebResponse response = Util.SendWebRequest<TPing>(url, data, 30000);

    var res = new TPong(); // USE TPong HERE
    if (response != null)
    {
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            var objText = reader.ReadToEnd();
            res = JsonConvert.DeserializeObject<TPong>(objText); // AND HERE
        }
    }
    return res;
}

new() , TPong . , res = new TPong();

TPong DeserializeObject<TPong>.

+1
void foo<TOne, TTwo>() 
   where TOne : BaseOne
   where TTwo : BaseTwo

var fooObj = foo<Ping,Pong>(url, data);

. MSDN

0

:

private T ReadDataFromApi<S,T>(string url, S data) where S : class where T : class

:

var myPong = ReadDataFromApi<Ping,Pong>(url, data);

Func < T, TResult > ,

0
source

All Articles