Calling a function based on parameter type

.net, c#, generics, interface, list

Solution

Make a `base class` or use an `interface`:

public interface IBase<T>
{
     List<T> GetAll();
     void SaveAll(List<T> items);
}

public class RepA : IBase<RepA> 
{
    public List<RepA> GetAll() { return new List<RepA>(); }
    public void SaveAll(List<RepA> repA) { }
}

public class RepB : IBase<RepB> 
{
    public List<RepB> GetAll() { return new List<RepB>(); }
    public void SaveAll(List<RepB> repB) { }
}

void Main() 
{
    IBase chosenType = RandomChosenType();
    var list = chosenType.GetAll();
}

Problem

I am trying to figure out how to simplify the following let's say I have 2 entity classes ``` public class A { public int Id { get; set; } public string Name { get; set; } public string City { get; set; } } ``` AND ``` public class B { public int Id { get; set; } public string Nom { get; set; } public string Ville { get; set; } } ``` classes that are similar, but not the same. each class has a repository classes it uses for CRUD Operations, for example... ``` public class RepA { public static List<A> GetAll() { List<A> list = new List<A>(); A a1 = new A() {Id=1, Name="First A", City="Boston"}; A a2 = new A() {Id=2, Name="First B", City="Chicago"}; A a3 = new A() {Id=3, Name="First C", City="San Francisco"}; list.Add(a1); list.Add(a2); list.Add(a3); return list; } public static void SaveAll(List<A> list) { foreach (A a in list) { Console.WriteLine("Saved Id = {0} Name = {1} City={2}", a.Id, a.Name, a.City); } } } ``` AND ``` public class RepB { public static List<B> GetAll() { List<B> list = new List<B>(); B b1 = new B() {Id=1, Nom="Second A", Ville="Montreal"}; B b2 = new B() {Id=2, Nom="Second B", Ville="Paris"}; B b3 = new B() {Id=3, Nom="Second C", Ville="New Orleans"}; list.Add(b1); list.Add(b2); list.Add(b3); return list; } public static void SaveAll(List<B> list) { foreach (B b in list) { Console.WriteLine("Saved Id = {0} Name = {1} City={2}", b.Id, b.Nom, b.Ville); } } } ``` How would I go about making anonymous call to my repository without having to resort to this, because in my real world example, i have 100 repositories, and not 2. ``` void Main() { ChosenType chosentype = RandomChosenType(); //A or B switch (chosentype) { case ChosenType.A: var listA = RepA.GetAll(); RepA.SaveAll(listA); break; case ChosenType.B: var listB = RepB.GetAll(); RepB.SaveAll(listB); break; default: break; } } ```

Original source