C# 泛型 - 了解要在抽象方法中使用的派生类



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

interface FileType {}
class FileType1 : FileType {}
class FileType2 : FileType {}
abstract class FileProcessor {}
class Processor_FileType1 : FileProcessor {} // Will use FileType1 - type of storage class
class Processor_FileType2 : FileProcessor {} // Will use FileType2 - type of storage class

因此,由于每个FileProcessor都使用不同类型的FileType,我希望在我的 BaseFileProcessor类中编写某种方法,以便能够从文件中获取值,如下所示:

abstract class FileProcessor 
{
protected List<T> getValuesFromFile<T>() where T:FileType
{
try
{
otherClass.doProcess<T>();
}
catch (Exception ex)
{
throw new Exception("Unable to retrieve the data from the file.", ex);
}
}
}

而且,在我一直在使用的另一个库中(与解析 Excel 文件相关(,我无法更改,我有以下方法:

public List<T> doProcess<T>() where T : class, new()
{
// the actual work
}

但是我在getValuesFromFile方法中遇到错误,指出The type 'T' must be a reference Type能够在我的方法中返回列表。

我正在尝试弄清楚如何做到这一点,以最大程度地减少编写将数据从文件拉取到每个单独的派生处理器类中的代码。

有没有办法做到这一点,或者这只是泛型的糟糕编程?

您的otherClass.doProcess()方法声明为

public List<T> doProcess<T>() where T : class, new()

因此,这要求T引用类型并具有默认的无参数构造函数

在调用方法中,您只限制T来实现FileType接口:

List<T> getValuesFromFile<T>() where T:FileType

这还不够。接口也可以由值类型实现,它不说明构造函数的任何内容。因此,您必须将约束更改为:

List<T> getValuesFromFile<T>() where T: class, FileType, new()

(请注意,class约束必须是约束声明中的第一个约束(。

您可以通过约束为以下内容来确保 T 是引用类型:

where T : class, FileType

我很难确切地理解你想做什么,所以我无法更普遍地提供关于你使用泛型的指导。

最新更新