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; } } ```