C# OOP-将两个表合并到同一个对象中
我在数据库中有两个表,它们几乎用于相同的事情,但是这些表的结构并不完全相同 假设我有一个表用于手动请求,另一个表用于自动请求。我必须将两个表加载到同一个GridView中,并且使用自定义业务对象 为了说明这个问题,我将TManualReqTable和TAutomaticReqTable称为TManualReqTableC# OOP-将两个表合并到同一个对象中,c#,oop,C#,Oop,我在数据库中有两个表,它们几乎用于相同的事情,但是这些表的结构并不完全相同 假设我有一个表用于手动请求,另一个表用于自动请求。我必须将两个表加载到同一个GridView中,并且使用自定义业务对象 为了说明这个问题,我将TManualReqTable和TAutomaticReqTable称为TManualReqTable TManualReqTable - ID - Field1 - Field2 - Field3 - Field4 及 在代码中,我对这两个表使用相同的对象。我有一个包含两个表
TManualReqTable
- ID
- Field1
- Field2
- Field3
- Field4
及
在代码中,我对这两个表使用相同的对象。我有一个包含两个表的所有属性的接口,并且在将数据加载到对象时检查字段是否存在
但我认为这应该用两个对象和一个带有抽象方法的超类来创建
您对此有何看法?我遵循一条避免创建基类的一般规则,除非:
我遵循一般规则避免创建基类,除非:
我将创建一个接口
IRequest
,该接口描述了这两者通用的字段和方法,然后为实现IRequest
的ManualRequest
和AutomaticRequest
创建接口和类,并添加它们各自特有的方法/字段
您可以使用IRequest
作为包含其中任一项的内容的类型。在遍历可能包含其中任何一个对象的数据时,可以检查每个对象是否实现了接口:
foreach (IRequest obj in RequestList) {
// do stuff that uses the common interface
if (obj is IManualRequest) {
// do stuff specific to manual requests
} else if (obj is IAutomaticRequest) {
// likewise
}
}
我将创建一个接口
IRequest
,该接口描述了这两者通用的字段和方法,然后为实现IRequest
的ManualRequest
和AutomaticRequest
创建接口和类,并添加它们各自特有的方法/字段
您可以使用IRequest
作为包含其中任一项的内容的类型。在遍历可能包含其中任何一个对象的数据时,可以检查每个对象是否实现了接口:
foreach (IRequest obj in RequestList) {
// do stuff that uses the common interface
if (obj is IManualRequest) {
// do stuff specific to manual requests
} else if (obj is IAutomaticRequest) {
// likewise
}
}
在我看来,先别管数据库是什么样子了
希望能有所帮助。在我看来,先别管数据库是什么样子的
希望能有所帮助。好吧,我在这里做了一些假设,让我把它们说清楚 鉴于:
public enum EQueryMode
{
Manual,
Automatic
}
public class FieldSpecification
{
public string FieldName { get; set; }
public bool[] QueryInMode { get; set; }
public FieldSpecification
(
string parFieldName,
bool parQueryInManual,
bool parQueryInAutomatic
)
{
FieldName = parFieldName;
QueryInMode = new bool[] { parQueryInManual, parQueryInAutomatic };
}
}
public class SomeKindOfRecord
{
public List<FieldSpecification> FieldInfo =
new List<FieldSpecification>()
{
new FieldSpecification("Field1", true, true),
new FieldSpecification("Field2", true, false),
new FieldSpecification("Field3", true, true),
new FieldSpecification("Field4", true, false)
};
// ...
public void PerformQuery(EQueryMode QueryMode)
{
List<string> FieldsToSelect =
(
from f
in FieldInfo
where
f.QueryInMode[(int)QueryMode]
select
f.FieldName
)
.ToList();
Fetch(FieldsToSelect);
}
private void Fetch(List<string> Fields)
{
// SQL (or whatever) here
}
}
public enum equalymode
{
手册
自动的
}
公共类字段规范
{
公共字符串字段名{get;set;}
公共bool[]查询模式{get;set;}
公共字段规范
(
字符串parFieldName,
布尔公园手册,
布尔帕尔克酒店
)
{
FieldName=parFieldName;
QueryInMode=new bool[]{parQueryInManual,parQueryInAutomatic};
}
}
公共类记录
{
公共列表字段信息=
新名单()
{
新的现场规范(“现场1”,正确,正确),
新的现场规范(“现场2”,正确,错误),
新的现场规范(“现场3”,正确,正确),
新的现场规范(“现场4”,对,错)
};