如何创建一个在C#中创建通用列表的函数

时间:2012-05-26 21:57:38

标签: c# list generics

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

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

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

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

不幸的是,这是不可能的(没有反思): Create list of variable type

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

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

感谢

2 个答案:

答案 0 :(得分:5)

为什么不使用泛型?

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

您可以将其称为

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

您还可以使用Dictionary来存储每种类型的表名,因此您不必为该方法提供表名。

答案 1 :(得分: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个不同的Select Queries,并将其作为数据层中的数据集捕获。提取表并填写其各自的列表,并将您的联接类返回到UI层。

public YourThings FunctionToReturnSingleYourThing()
{
}

如果你需要一组YourThings,重建你的逻辑并像这样返回

public List<YourThings> FunctionToReturnMultipleYourThings()
{
}