C#泛型工厂模式没有说明泛型的类型

时间:2018-05-09 20:53:19

标签: c# generics reflection factory

我正在开发一个C#项目来解析不同类型的文件。为此,我创建了以下类结构:

interface FileType {}
    class FileType1 : FileType {}
    class FileType2 : FileType {}

abstract class FileProcessor<T> {}
    class Processor_FileType1 : FileProcessor<FileType1> {} 
    class Processor_FileType2 : FileProcessor<FileType2> {} 

现在,我想创建一个工厂模式,只需要获取文件的路径,根据文件的内容决定实例化2个处理器中的哪一个

理想情况下(我知道这段代码不起作用),我希望我的代码看起来如下:

class ProcessorFactory
{
    public FileProcessor Create(string pathToFile)
    {
        using (var sr = pathToFile.OpenText())
        {
            var firstLine = sr.ReadLine().ToUpper();

            if (firstLine.Contains("FIELD_A"))
                return new Processor_FileType1();

            if (firstLine.Contains("FIELD_Y"))
                return new Processor_FileType2();
        }
    }
}

问题是编译器错误Using the generic type 'FileProcessor<T>' requires 1 type arguments 所以我的程序可以做类似的事情:

public DoWork()
{
    string pathToFile = "C:/path to my file.txt";
    var processor = ProcessorFactory.Create(pathToFile);
}

processor变量可以是Processor_FileType1Processor_FileType2

我知道我可以通过更改Create来获取类型参数来做到这一点,但是我希望我不会这样做,因为它会根据数据中的数据来解决这个问题。文件。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

你非常接近。在对象模型中只需要一个概念,一个常见的IFileProcessor。

interface FileType {}
    class FileType1 : FileType {}
    class FileType2 : FileType {}

interface IFileProcessor {}  //new
abstract class FileProcessor<T> : IFileProcessor {}
    class Processor_FileType1 : FileProcessor<FileType1> {} 
    class Processor_FileType2 : FileProcessor<FileType2> {} 

并更改您的退货类型:

public IFileProcessor Create(string pathToFile)
{
    //implementation
}