C#通用工厂模式,但不说明通用工厂模式的类型
我正在做一个C#项目来解析不同类型的文件。为此,我创建了以下类型的类结构:C#通用工厂模式,但不说明通用工厂模式的类型,c#,generics,reflection,factory,C#,Generics,Reflection,Factory,我正在做一个C#项目来解析不同类型的文件。为此,我创建了以下类型的类结构: interface FileType {} class FileType1 : FileType {} class FileType2 : FileType {} abstract class FileProcessor<T> {} class Processor_FileType1 : FileProcessor<FileType1> {} class Pro
interface FileType {}
class FileType1 : FileType {}
class FileType2 : FileType {}
abstract class FileProcessor<T> {}
class Processor_FileType1 : FileProcessor<FileType1> {}
class Processor_FileType2 : FileProcessor<FileType2> {}
问题是编译器错误使用泛型类型“FileProcessor”需要1个类型参数
因此,我的程序可以执行以下操作:
public DoWork()
{
string pathToFile = "C:/path to my file.txt";
var processor = ProcessorFactory.Create(pathToFile);
}
而processor
变量将是processor\u FileType1
或processor\u 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> {}
你很接近。您只需要在对象模型中再添加一个概念,即通用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> {}
您的示例中的代码有什么问题?看起来它可以正常工作。抱歉,@JohnWu,我更新了问题-编译器使用泛型类型“FileProcessor”引发错误
需要1类型参数
最简单的修复方法是简单地在层次结构中引入一个新的基类,以便FileProcessor:FileProcessor
。请注意,在Visual Studio中,您可以将包含FileProcessor
的文件命名为FileProcessor{T}.cs
。接口IFileProcessor
会更好,但抽象基类有点不方便。另一种方法是将FileProcessor
更改为IFileProcessor
,然后返回IFileProcessor
。不过有点棘手,因为它涉及协方差。您的示例中的代码有什么问题?看起来它可以正常工作。抱歉,@JohnWu,我更新了问题-编译器使用泛型类型“FileProcessor”引发错误需要1类型参数
最简单的修复方法是简单地在层次结构中引入一个新的基类,以便FileProcessor:FileProcessor
。请注意,在Visual Studio中,您可以将包含FileProcessor
的文件命名为FileProcessor{T}.cs
。接口IFileProcessor
会更好,但抽象基类有点不方便。另一种方法是将FileProcessor
更改为IFileProcessor
,然后返回IFileProcessor
。不过有点棘手,因为它涉及协方差。哇-太简单了!!!-我不是100%确定为什么要修复它,并且必须更多地考虑它,但它确实起了作用!!!非常感谢。哇-太简单了!!!-我不是100%确定为什么要修复它,并且必须更多地考虑它,但它确实起了作用!!!非常感谢。
public IFileProcessor Create(string pathToFile)
{
//implementation
}