Quantcast
Channel: Web API
Viewing all articles
Browse latest Browse all 4850

Call webapi return list of object but can not cast to base type of object?

$
0
0

I have some class:

public class Base
{
    public string Name;
}

public class AClass : Base
{
    public string AAtribute;
}

public class BClass : Base
{
    public string BAtribute;
}

I create WebApi with ApiController' class:

public class TestController : ApiController
{
    [HttpGet]
    public IHttpActionResult GetAll()
    {
        var d = new List<Base>{
            new AClass() { Name = "A", AAtribute = "A1" },
            new BClass() { Name = "B", AAtribute = "B1" },
            new BClass() { Name = "B", AAtribute = "B2" },
            new BClass() { Name = "B", AAtribute = "B3" },
            new AClass() { Name = "A", AAtribute = "A2" }
        };
        
        return Ok(d);
    }
}

Class to call WebApi:

public class RestClient<T> : IDisposable where T : class
{
    private readonly string _baseAddress;

    public RestClient(string baseAddress)
    {
        _baseAddress = baseAddress;
    }

    private void SetupClient(System.Net.Http.HttpClient client, string contentType)
    {
        client.BaseAddress = new Uri(_baseAddress);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(contentType));
    }
    
    public async Task<IEnumerable<T>> GetItems(string actionName, string contentType)
    {
        IEnumerable<T> r = null;

        using (var client = new System.Net.Http.HttpClient())
        {
            SetupClient(client, contentType);

            var response = await client.GetAsync(actionName);

            response.EnsureSuccessStatusCode();

            if (response.IsSuccessStatusCode)
            {
                r = await response.Content.ReadAsAsync<IEnumerable<T>>();
            }
        }

        return r;
    }
}

Unit test to call WebApi:

var d = List<Base>();

using (var client = new RestClient<Base>("http://xxx"))
{
    try
    {
        var r = client.GetItems("api/Test/GetAll", "application/json");

        var d = r.Result;

        foreach (var m in d)
        {
            var name = m.Name;

            Base x;
            if (name == "A") x = (AClass) m;
            if (name == "B") x = (BClass) m;
            if (x == null) continue;
            
            d.Add(x);
        }
    }
    catch (Exception ex)
    {
    }
}

When i run unit test but exception cast Base to AClass or BClass. How do fix it????

Thanks.


Viewing all articles
Browse latest Browse all 4850


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>