Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#通用工厂模式,但不说明通用工厂模式的类型_C#_Generics_Reflection_Factory - Fatal编程技术网

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

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

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
}