C# 在接口中使用泛型方法返回基于文件输入的变量类型列表
我有一个应用程序,需要从文件中读取数据记录,并根据读取的记录类型创建对象列表。有六种可能的记录类型可以读入。我发现FileHelpers库有助于创建我指定的任何类型的对象。我试图以这样一种方式编写它:一个reader/file解析器类可以处理返回读入的任何类型的记录。我正在探索使用一个通用接口/方法来实现这一点的可能性,但我有点困在如何正确实现它上 我有一个ReaderFactory,它将为我返回一个特定类型的阅读器,并且所有阅读器都继承自MainReaderC# 在接口中使用泛型方法返回基于文件输入的变量类型列表,c#,generics,interface,factory,C#,Generics,Interface,Factory,我有一个应用程序,需要从文件中读取数据记录,并根据读取的记录类型创建对象列表。有六种可能的记录类型可以读入。我发现FileHelpers库有助于创建我指定的任何类型的对象。我试图以这样一种方式编写它:一个reader/file解析器类可以处理返回读入的任何类型的记录。我正在探索使用一个通用接口/方法来实现这一点的可能性,但我有点困在如何正确实现它上 我有一个ReaderFactory,它将为我返回一个特定类型的阅读器,并且所有阅读器都继承自MainReader public interface
public interface MainReader<T>
{
void ReadFile(string vsFileName);
List<T> GetRecords();
}
public class ReaderFactory<T>
{
MainReader<T> GetReader(RecordType recordType)
{
MainReader<T> oReader = null;
switch (recordType)
{
case RecordType.TypeA:
oReader = new TypeAReader();
break;
case RecordType.TypeB:
oReader = new TypeBReader();
break;
}
return oReader;
}
公共接口主读卡器
{
void ReadFile(字符串vsFileName);
列出GetRecords();
}
公共类ReaderFactory
{
MainReader GetReader(记录类型记录类型)
{
MainReader或Reader=null;
开关(记录型)
{
case RecordType.TypeA:
oReader=新的TypeAReader();
打破
case RecordType.TypeB:
oReader=新的TypeBReader();
打破
}
返回或加载程序;
}
读取器本身将获取一个文件,并使用FileHelpers库将数据读入对象列表
class TypeAReader : MainReader<RecordTypeA>
{
public List<RecordTypeA> oRecordList = new List<RecordTypeA>();
public void ReadFile(string fileName)
{
FileHelperEngine<RecordTypeA> oEngine = new FileHelperEngine<RecordTypeA>();
RecordTypeA[] records = oEngine.ReadFile(fileName);
foreach(RecordTypeA record in records)
{
oRecordList.Add(record);
}
}
public List<RecordTypeA> GetRecords()
{
return oRecordList;
}
}
class TypeAReader:MainReader
{
公共列表或记录列表=新列表();
公共void ReadFile(字符串文件名)
{
FileHelperEngine oEngine=新的FileHelperEngine();
RecordTypeA[]记录=oEngine.ReadFile(文件名);
foreach(记录类型记录中的记录)
{
oRecordList.Add(记录);
}
}
公共列表记录()
{
返回记录列表;
}
}
构建时,我得到错误“无法隐式地将TypeAReader转换为MainReader”。如果我更改工厂以返回新的TypeAReader或TypeAReader,我会得到与无法将TypeAReader转换为MainReader相同的错误
<> p>我相信有办法做到这一点,我必须错过一些东西。任何帮助都是非常值得赞赏的。 对于你的编译问题——你缺少一个演员:<代码> ORADADER =(MeNeRead)新的Type AdRead()/Case>将做一个工作。如果你想知道为什么没有编译,请考虑下一个调用:
new ReaderFactory<int>().GetReader(RecodrTypeA)
您还可以通过将T限制为接口来添加一些静态类型保护,以防止调用GetReader()
(仍有争议)
接口IRecordType{}
类RecordTypeA:IRecordType{}
类RecordTypeB:IRecordType{}
...
MainReader GetReader(),其中T:IRecordType
将其强制转换为所需类型,例如oReader=(MainReader)new TypeAReader()
创建此类的驱动程序是什么-而不仅仅是使用已经通用的FileHelperEngine{T}
?如果您想提供更多上下文,例如工厂的消费者如何提供记录类型值以及您如何使用记录列表,则可以建议更好的设计。
public class ReaderFactory
{
MainReader<T> GetReader<T>()
{
var returnType = typeof(T);
if(returnType==typeof(RecordTypeB))
return (MainReader<T>)new TypeBReader();
if (returnType == typeof(RecordTypeA))
return (MainReader<T>)new TypeAReader();
throw new NotImplementedException();
}
}
interface IRecordType{}
class RecordTypeA:IRecordType{}
class RecordTypeB:IRecordType{}
...
MainReader<T> GetReader<T>() where T:IRecordType