如何创建在 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 手动将列表中的每个"事物"转换为正确的事物并传递给他一些转换器。
我不喜欢这个解决方案,感觉不对,因为我创建了一个列表并创建了一个新列表。 效率非常低。有没有更好的方法可以做到这一点?
谢谢
为什么不使用泛型?
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()
{
}