Два класса, но один и тот же объект - PullRequest
0 голосов
/ 29 марта 2019

У меня есть 2 таблицы, tblA и tblB, с одинаковыми полями и типами.Я получаю данные через linq to sql, поэтому у меня есть 2 частичных класса clsTblA и clsTblB.

У меня есть комбо, чтобы выбрать tblA или tblB, и я должен прочитать в этой таблице и выполнить какой-либо запрос.

Я пытаюсь дублировать код для запуска тех же методов.Так что теперь у меня есть (в псевдокоде):

if (combo == "A")
{
  List<clsTblA> listUserNow = ctx.clsTblA.Where(p => p.blabla).ToList();
  List<clsTblA> listUserLastYear = ctx.clsTblA.Where(q => q.blabla).ToList();
}
if (combo == "B")
{
  List<clsTblB> listUserNow = ctx.clsTblB.Where(p => p.blabla).ToList();
  List<clsTblB> listUserLastYear = ctx.clsTblB.Where(q => q.blabla).ToList();
}

Но я имею в виду нечто подобное (в псевдокоде):

SupClsTable clsTblX = null;
if (combo == A)
  clsTblX = new clsTblA();
if (combo == B)
  clsTblX = new clsTblB();

List<clsTblX> listUserNow = tblX.QueryForNow();
List<clsTblX> listUserLastYear = tblX.QueryForLastYear();

Существует ли что-то подобное?Я также искал в шаблоне проектирования, но без результатов.

Заранее спасибо.

РЕДАКТИРОВАТЬ 1: На данный момент код выглядит так:

if (combo == A)
{
  using (DbDataContext ctx = new DbDataContext())
  {
      List<clsTblA> listUserNow = ctx.clsTblA.Where(p => p.blabla).ToList();
      List<clsTblA> listUserLastYear = ctx.clsTblA.Where(q => q.blabla).ToList();
  }
}
if (combo == B)
{
  using (DbDataContext ctx = new DbDataContext())
  {
      List<clsTblB> listUserNow = ctx.clsTblB.Where(p => p.blabla).ToList();
      List<clsTblB> listUserLastYear = ctx.clsTblB.Where(q => q.blabla).ToList();
  }
}

, поэтому у меня есть два разаlistUserNow и listUserLastYear.Как я могу позволить мне вернуть уникального

using (DbDataContext ctx = new DbDataContext()) 
{
    List<*something*> listUserNow = ctx.*something*.Where(p => p.blabla).ToList();
    List<*something*> listUserLastYear = ctx.*something*.Where(p => p.blabla).ToList();
}

независимого от "если комбо"?Спасибо в адвенсе

Ответы [ 3 ]

0 голосов
/ 29 марта 2019

Хотя лично я считаю, что интерфейс лучше для вашего случая использования, вы также можете реализовать нечто подобное, что облегчит вам расширение.То же самое можно отнести и к интерфейсу.Поэтому каждый раз, когда добавляется новая комбинация, просто добавьте кейс, и он легко расширяется.

public class ComboFactory
{
    public static SuperCombo GetComboClassInstance(string comboCode)
    {
        switch(comboCode)
        {
            case "A":
                return new ComboA();
            case "B":
                return new ComboB();
            //and so on
        }
    }
}
0 голосов
/ 29 марта 2019

Попробуй посмотреть, если это то, что тебе нужно:

public interface iTbl
{
    int Property1 { get; set; }
    string Property2 { get; set; }

    void WhatAreYou();
}

public class clsTblA : iTbl
{
    public int Property1 { get; set; }
    public string Property2 { get; set; }

    public void WhatAreYou()
    {
        Console.WriteLine("I am a clsTblA!");
    }
}

public class clsTblB : iTbl
{
    public int Property1 { get; set; }
    public string Property2 { get; set; }

    public void WhatAreYou()
    {
        Console.WriteLine("I am a clsTblB!");
    }
}

public class Program
{
    public static void Main()
    {
        List<iTbl> tbls = new List<iTbl>()
        {
            new clsTblA(),
            new clsTblB(),
            new clsTblB(),
            new clsTblA(),
            new clsTblA()
        };

        foreach (var tbl in tbls)
        {
            tbl.WhatAreYou();
        }
    }
}

Вывод:

I am a clsTblA!
I am a clsTblB!
I am a clsTblB!
I am a clsTblA!
I am a clsTblA!
0 голосов
/ 29 марта 2019

Похоже, что вы ищете интерфейсы.то есть

interface ISampleInterface
{
    void SampleMethod();
}

class ImplementationClass : ISampleInterface
{
    // Explicit interface member implementation: 
    void ISampleInterface.SampleMethod()
    {
        // Method implementation.
    }
}

Подробнее об этом можно узнать на сайте документации Microsoft Документы Microsoft

РЕДАКТИРОВАТЬ: очистить.После того, как оба класса инершируют из интерфейса, вы можете написать следующее

if (combo == A)
  clsTblX = new clsTblA();
if (combo == B)
  clsTblX = new clsTblB();

следующим образом

IClsTable clsTbl = (combo == A)? new ClsTblA() : new ClsTblB() // example

и работать с clsTbl так же, как вы ранее работали с ClsTblA илиClsTblB, поскольку оба имеют одинаковую структуру и имеют одинаковые свойства и методы.

Может быть этот пример dotnetfiddle поможет вам понять концепцию этого решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...