我在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手动将列表中的每个“东西”转换为正确的东西并传递给他一些转换器
我不喜欢这个解决方案,感觉不对,因为我创建了一个列表并创建了一个新列表。非常低效。 有更好的方法吗?
感谢
答案 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()
{
}