using System.Collections.Generic;
public static void Main()
Console.WriteLine("Generic Test");
a = Caller.doApiCall("");
Console.WriteLine(a.ToString());
Software b = new Software();
b = (Software)Caller.doApiCall("");
Console.WriteLine(b.ToString());
Console.WriteLine("\n\n\nThis will fail due to the Dog being an Animal but not all Animals are dogs situation \n\n\n");
Crap w = Caller.doApiCall("");
Software c = new Software();
Console.WriteLine(c.deserialize(w).ToString());
Software z = new Software();
Console.WriteLine(z.deserialize(Caller.doApiCall("")).ToString());
Console.WriteLine("\n\n\nShowing generic works! \n\n\n");
RandomOther n = new RandomOther();
Console.WriteLine(n.deserialize(Caller.doApiCall("")).ToString());
Console.WriteLine("\n\n\nShowing up-casting works! \n\n\n");
Crap m = new RandomOther();
Console.WriteLine(m.deserialize(Caller.doApiCall("")).ToString());
RandomOther l = (RandomOther) m;
Console.WriteLine(l.deserialize(Caller.doApiCall("")).ToString());
public static Crap doApiCall(string endpoint)
Crap apiResults = new Crap();
apiResults.response = @"{
apiResults.statusCode = 200;
public interface ICrap<T> {
List<T> deserializeList(Crap c);
public class Crap: ICrap<Crap>
public override string ToString() {
return "Crap: " + statusCode+" "+response;
public Crap deserialize(Crap c) {
public List<Crap> deserializeList(Crap c) {
public class RandomOther : Crap, ICrap<RandomOther>
public int Application2Id
public override string ToString() {
return "RandomOther: " + statusCode+" "+response;
public new List<RandomOther> deserializeList(Crap c) {
return new List<RandomOther>();
public new RandomOther deserialize(Crap c)
this.response = c.response;
this.statusCode = c.statusCode;
this.Application2Id = 24;
public class Software : Crap, ICrap<Software>
public override string ToString() {
return "Software: " + statusCode+" "+response;
public new List<Software> deserializeList(Crap c) {
return new List<Software>();
public new Software deserialize(Crap c)
this.response = c.response;
this.statusCode = c.statusCode;