用C#中的泛型实现多态性
本文关键字:实现 多态性 泛型 | 更新日期: 2023-09-27 18:25:25
我目前正在开发一个C#程序,该程序从Excel文件中读取测量数据,将其解析为对象,并提供将其插入数据库的可能性(顺便说一句,我使用NHibernate)
该程序将具有GUI实现。测量数据有多种形式。(例如,来自电机的数据或来自配电盘的数据)。问题是,我只想定义一个Form类(GUI窗口),而不管测量数据是什么
我有两个解析器,MotorParser和SwitchboardParser,它们都有一个名为IList ParseDataTableToList(DataTable DataTable,DBConnectionWrapper dBCon)的方法,其中T是Motor对象或Switchboard对象。因此,我的想法是创建一个带有泛型的接口,它将由以下两个类实现:
public interface IParser<T>
{
IList<T> ParseDataTableToList(DataTable dataTable, DBConnectionWrapper dBCon);
}
另一方面,我确实有数据库存储库,它实现了一个方法void InsertOrUpdate(T list),其中T再次是Motor或Switchboard对象。我还为此实现了一个接口:
public interface IInsertOrUpdateList<T>
{
void InsertOrUpdate(IList<T> list);
}
好吧,现在的想法是转发一个特定的IInsertOrUpdateList对象(MotorRepository或SwitchboardRepository)和一个IParser(MotorParser或Switchboard Parser)。前面提到的Form类(我称之为ImportView)应该只使用这些接口。问题是,当使用泛型时,我不知道这是否或如何可能。
这是我心目中实现的一个无效语法:
public partial class ImportView : Form
{
private IParser parser;
private IInsertOrUpdateList repository;
private dataToParse;
public ImportView(DataTable dataToParse, IParser parser, IInsertOrUpdateList repository)
{
this.parser = parser;
this.repository = repository;
this.dataToParse = dataToParse;
}
public void ParseAndInsertIntoDB()
{
repository.InsertOrUpdateList(parser.ParseDataTableToList(dataToParse, null));
}
}
当我实例化这个窗口时,我会提供确定这是电机还是配电盘对象的测量数据的对象:
ImportView = new ImportView(dataToParse, new MotorParser(), new MotorRepository());
或
ImportView = new ImportView(dataToParse, new SwitchboardParser(), new SwitchboardRepository());
有没有办法让我意识到泛型的问题,或者我的方法完全错误了?我对任何想法都持开放态度。
可以通过以下泛型实现这一点:
首先,您想为解析器和存储库创建泛型类:
public class Parser<T> : IParser<T>
{
IList<T> ParseDataTableToList(DataTable dataTable, object o)
{
var list = new List<T>();
//Your parsing logic can go:
//1) Here(using reflection, for example) or
//2) in the constructor for Motor/Switchboard object,
//in witch case they will take a reader or row object
return list;
}
}
public class Repo<T> : IInsertOrUpdateList<T>
{
void InsertOrUpdate(IList<T> list)
{
//...
}
}
然后,您的Generic窗口类如下所示:
public partial class ImportView<T> : Form
{
private IParser<T> parser;
private IInsertOrUpdateList<T> repository;
private DataTable dataToParse;
public ImportView(DataTable dataToParse)
{
this.parser = new Parser<T>();
this.repository = new Repo<T>();
this.dataToParse = dataToParse;
}
public void ParseAndInsertIntoDB()
{
repository.InsertOrUpdate(parser.ParseDataTableToList(dataToParse, null));
}
}
你这样实例化它:
var ImportView = new ImportView<Motor>(YourDataTable)