0

我在数据库中有 4 个表,每个表都有 Id 和 Name,但它们代表不同的东西。对于每个“事物”,我都有一个不同的类,它们都继承自“事物”。我有 4 个功能:

List<thing1> getAllThings1();
List<thing2> getAllThings2();
List<thing3> getAllThings3();
List<thing4> getAllThings4();

每个函数从不同的表中读取并创建所需的列表。

因为我想避免代码重复,所以我想创建一个实用函数来接收表名(作为字符串)和类型(thing1、thing2 ... 等),然后返回List<t>.

不幸的是,这是不可能的(没有反射): 创建变量类型列表

我目前的解决方案是我有一个返回列表的函数,我在每个“getAllThings#”中调用她,然后使用 ConvertAll 手动将列​​表中的每个“事物”转换为正确的事物,并将一些转换器传递给他。

我不喜欢这个解决方案,感觉不对,因为我创建了一个列表并创建了一个新列表。非常低效。有更好的方法吗?

谢谢

4

2 回答 2

5

为什么不使用泛型?

public IList<T> GetAllThings<T>(string tableName) where T : Thing {
    return new List<T>();
}

您将可以调用它

IList<Thing4> things4 = thingProvider.GetAllThing<Thing4>( "thing4Table" );

您还可以有一个 Dictionary 用于存储每种类型的表名,因此您不必向该方法提供表名。

于 2012-05-26T22:07:08.070 回答
1

试试这个又快又脏。不实际,可能有错误,可以作为参考。

创建具有所有共同属性的事物的基类

abstract ThingBase
{
   protected abstract   int Id {get;set;}
   protected abstract   string Name {get;set;}
}

将该基础实现到您的四个事物类

public Thing1 :ThingBase
{
   public int Id {get;set;}
   public string Name {get;set;}
}
public Thing2 :ThingBase
{
   public int Id {get;set;}
   public string Name {get;set;}
}
public Thing3 :ThingBase
{
   public int Id {get;set;}
   public string Name {get;set;}
}
public Thing4 :ThingBase
{
   public int Id {get;set;}
   public string Name {get;set;}
}

再创建一个帮助类,它将包含所有 4 件事的列表

public class YourThings
{
    public IList<Thing1> thing1 {get;set;}
    public IList<Thing2> thing2 {get;set;}
    public IList<Thing3> thing3 {get;set;}
    public IList<Thing4> thing4 {get;set;}

}

现在在您的 SP 中编写 4 个不同的选择查询并将其作为数据集捕获到您的数据层中。提取表格并填写其各自的列表并将您的东西类返回给 UI 层。

public YourThings FunctionToReturnSingleYourThing()
{
}

如果您需要 YourThings 的集合,请重建您的逻辑并像这样返回

public List<YourThings> FunctionToReturnMultipleYourThings()
{
}
于 2012-05-26T22:39:56.927 回答