C# 在接口中使用泛型方法返回基于文件输入的变量类型列表

C# 在接口中使用泛型方法返回基于文件输入的变量类型列表,c#,generics,interface,factory,C#,Generics,Interface,Factory,我有一个应用程序,需要从文件中读取数据记录,并根据读取的记录类型创建对象列表。有六种可能的记录类型可以读入。我发现FileHelpers库有助于创建我指定的任何类型的对象。我试图以这样一种方式编写它:一个reader/file解析器类可以处理返回读入的任何类型的记录。我正在探索使用一个通用接口/方法来实现这一点的可能性,但我有点困在如何正确实现它上 我有一个ReaderFactory,它将为我返回一个特定类型的阅读器,并且所有阅读器都继承自MainReader public interface

我有一个应用程序,需要从文件中读取数据记录,并根据读取的记录类型创建对象列表。有六种可能的记录类型可以读入。我发现FileHelpers库有助于创建我指定的任何类型的对象。我试图以这样一种方式编写它:一个reader/file解析器类可以处理返回读入的任何类型的记录。我正在探索使用一个通用接口/方法来实现这一点的可能性,但我有点困在如何正确实现它上

我有一个ReaderFactory,它将为我返回一个特定类型的阅读器,并且所有阅读器都继承自MainReader

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