如何创建在 C# 中创建泛型列表的函数

本文关键字:创建 泛型 列表 函数 何创建 | 更新日期: 2023-09-27 18:35:36

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

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

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

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

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

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

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

谢谢

如何创建在 C# 中创建泛型列表的函数

为什么不使用泛型?

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

您将能够调用它

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

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

试试这个快速而肮脏的方法。不是实际的,可能包含错误,您可以将其用作参考。

创建具有所有常见属性的事物的基类

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()
{
}

如果你需要一个集合你的东西,重建你的逻辑并像这样返回

public List<YourThings> FunctionToReturnMultipleYourThings()
{
}