5

質問のタイトルについてはわかりませんが、ここにあります:-

私は自分のコードを次のように持っています:-

HttpClient client = new HttpClient();// Create a HttpClient
client.BaseAddress = new Uri("http://localhost:8081/api/Animals");//Set the Base Address

//eg:- methodToInvoke='GetAmimals'
//e.g:- input='Animal' class
HttpResponseMessage response = client.GetAsync('GetAllAnimals').Result;  // Blocking call!

if (response.IsSuccessStatusCode)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Animal));//Animal is my Class (e.g)
    string data = response.Content.ReadAsStringAsync().Result;
    using (MemoryStream ms = new MemoryStream(UTF8Encoding.UTF8.GetBytes(data)))
    {
        var _response = (Animal)serializer.Deserialize(ms);
        return _response;
    }

}

別のクラスで同じことをする必要がある場合、これは完全にうまく機能しますDogCat

私がやっていることは: -

HttpClient client = new HttpClient();// Create a HttpClient
    client.BaseAddress = new Uri("http://localhost:8081/api/Animals");//Set the Base Address

    //eg:- methodToInvoke='GetAmimals'
    //e.g:- input='Animal' class
    HttpResponseMessage response = client.GetAsync('GetAllDogs').Result;  // Blocking call!

    if (response.IsSuccessStatusCode)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Dog));//Animal is my Class (e.g)
        string data = response.Content.ReadAsStringAsync().Result;
        using (MemoryStream ms = new MemoryStream(UTF8Encoding.UTF8.GetBytes(data)))
        {
            var _response = (Dog)serializer.Deserialize(ms);
            return _response;
        }

    }

今、私はそれを以下のようなジェネリッククラスに変更したい:-

private T GetAPIData(T input,string parameters, string methodToInvoke)
        {
            try
            {

                HttpClient client = new HttpClient();
                client.BaseAddress = new Uri("http://localhost:8081/api/Animals");

                //eg:- methodToInvoke='GetAmimals'
                //e.g:- input='Animal' class
                HttpResponseMessage response = client.GetAsync(methodToInvoke).Result;  // Blocking call!

                if (response.IsSuccessStatusCode)
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(input));
                    string data = response.Content.ReadAsStringAsync().Result;
                    using (MemoryStream ms = new MemoryStream(UTF8Encoding.UTF8.GetBytes(data)))
                    {
                        var _response = (input)serializer.Deserialize(ms);
                        return _response;
                    }

                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return (T)input;
        }

しかし、私はそれをすることができません。このメソッドをどのように呼び出すのでしょうか。

var testData = GetAPIData(new Aminal(),null,'GetAmimals');

これは機能しますか... ジェネリックを使用するのはこれが初めてです。

4

2 に答える 2

5

メソッドの定義にジェネリック型パラメーターがありません。さらに、最初のパラメーター ( input) は使用しないため、必要ありません。メソッドのシグネチャは次のようになります。

private T GetAPIData<T>(string parameters, string methodToInvoke)

使用法は次のようになります。

var testData = GetAPIData<Animal>(null, "GetAllAnimals");

実装ではT、元のメソッドが使用されたすべての場所でDogorが使用されAnimalます。

さらに、
あなたの catch ブロックは何の価値も追加しません。実際、スローしてはならない基本例外クラスをスローし、元のスタック トレースを破棄することで、それを削除します。取り除くだけです。

最終的な方法は次のようになります。

private T GetAPIData<T>(string parameters, string methodToInvoke)
{
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri("http://localhost:8081/api/Animals");

    //eg:- methodToInvoke='GetAmimals'
    //e.g:- input='Animal' class
    HttpResponseMessage response = client.GetAsync(methodToInvoke).Result;

    if (!response.IsSuccessStatusCode)
        throw new InvalidOperationException("Request was not successful");

    XmlSerializer serializer = new XmlSerializer(typeof(T));
    string data = response.Content.ReadAsStringAsync().Result;
    using (MemoryStream ms = new MemoryStream(UTF8Encoding.UTF8.GetBytes(data)))
    {
        return (T)serializer.Deserialize(ms);
    }
}
于 2013-07-16T09:28:58.547 に答える
0

一般的な定義を見逃しました

private T GetAPIData<T>(string parameters, string methodToInvoke)

var testData = GetAPIData<Animal>(null,'GetAmimals');

パラメータinputは役に立たないので、削除できます。

タイプ costtraintを追加することもできます。

private T GetAPIData<T>(string parameters, string methodToInvoke) where T:IAnimal
于 2013-07-16T09:29:31.740 に答える