根据参数类型调用函数

Ser*_*Now 9 .net c# generics interface list

我想弄清楚如何简化以下内容

假设我有2个实体类

public class A
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string City { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和

public class B
{
    public int Id { get; set; } 
    public string Nom { get; set; }
    public string Ville { get; set; }
} 
Run Code Online (Sandbox Code Playgroud)

类似但不相同的类.

每个类都有一个用于CRUD操作的存储库类,例如......

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

}
Run Code Online (Sandbox Code Playgroud)

和

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

}
Run Code Online (Sandbox Code Playgroud)

如何在不必诉诸于此的情况下对我的存储库进行匿名调用,因为在我的真实世界示例中,我有100个存储库,而不是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*ren 3

制作base class或使用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();
}
Run Code Online (Sandbox Code Playgroud)