C# 泛型工厂模式,不声明泛型的类型
C# generic factory pattern without stating the type of generic
我正在开发一个 C# 项目来解析不同类型的文件。为此,我创建了以下类型的 class 结构:
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_FileType1
或 Processor_FileType2
。
我知道我可以通过更改 Create
来获取类型参数来做到这一点,但我希望从那以后我就不必这样做了,它扼杀了根据数据来计算它的想法在文件中。
有什么想法吗?
你非常接近。您只需要在您的对象模型中多一个概念,一个通用的 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> {}
并更改您的 return 类型:
public IFileProcessor Create(string pathToFile)
{
//implementation
}
我正在开发一个 C# 项目来解析不同类型的文件。为此,我创建了以下类型的 class 结构:
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_FileType1
或 Processor_FileType2
。
我知道我可以通过更改 Create
来获取类型参数来做到这一点,但我希望从那以后我就不必这样做了,它扼杀了根据数据来计算它的想法在文件中。
有什么想法吗?
你非常接近。您只需要在您的对象模型中多一个概念,一个通用的 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> {}
并更改您的 return 类型:
public IFileProcessor Create(string pathToFile)
{
//implementation
}