我有2个表,tblA和tblB,具有相同的字段和类型。我通过linq到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();
}
“ if combo”的从属? 提前致谢
答案 0 :(得分:0)
似乎您正在寻找的是接口。即
interface ISampleInterface
{
void SampleMethod();
}
class ImplementationClass : ISampleInterface
{
// Explicit interface member implementation:
void ISampleInterface.SampleMethod()
{
// Method implementation.
}
}
您可以在Microsoft文档站点Microsoft Docs
上了解更多相关信息。编辑:进行澄清。一旦两个类都从接口失效,您可以编写以下
if (combo == A)
clsTblX = new clsTblA();
if (combo == B)
clsTblX = new clsTblB();
如下
IClsTable clsTbl = (combo == A)? new ClsTblA() : new ClsTblB() // example
并像以前使用clsTbl
或ClsTblA
一样使用ClsTblB
,因为两者都遵循相同的结构,并且具有相同的属性和方法。
也许this dotnetfiddle example可以帮助您理解此解决方案的概念。
答案 1 :(得分:0)
虽然我个人认为接口对于您的用例来说是更好的选择,但是您也可以实现类似这样的方法,以便于扩展。同样可以对接口进行强制转换。因此,每次添加新的组合时,只需添加一个案例,它就很容易扩展。
public class ComboFactory
{
public static SuperCombo GetComboClassInstance(string comboCode)
{
switch(comboCode)
{
case "A":
return new ComboA();
case "B":
return new ComboB();
//and so on
}
}
}
答案 2 :(得分:0)
尝试看看这是否是您需要的:
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!