C# 泛型 - 知道在抽象方法中使用哪个派生 class
C# Generics - Know which derived class to use in an Abstract Method
我正在开发一个 C# 项目来解析不同类型的文件。为此,我创建了以下类型的 class 结构:
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
,我希望在我的 Base FileProcessor
class 中编写某种方法,以便能够从文件中获取值,如下所示:
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
能够 return 我的方法中的列表。
我正在尝试弄清楚如何做到这一点,以尽量减少编写代码以将数据从文件提取到每个单独的派生处理器 classes。
有什么办法可以做到这一点,或者这只是泛型的糟糕编程?
您可以通过如下约束来确保 T 是引用类型:
where T : class, FileType
我很难准确理解您要做什么,因此我无法提供有关您更普遍地使用泛型的指导。
您的 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
约束必须是约束声明中的第一个)。
我正在开发一个 C# 项目来解析不同类型的文件。为此,我创建了以下类型的 class 结构:
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
,我希望在我的 Base FileProcessor
class 中编写某种方法,以便能够从文件中获取值,如下所示:
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
能够 return 我的方法中的列表。
我正在尝试弄清楚如何做到这一点,以尽量减少编写代码以将数据从文件提取到每个单独的派生处理器 classes。
有什么办法可以做到这一点,或者这只是泛型的糟糕编程?
您可以通过如下约束来确保 T 是引用类型:
where T : class, FileType
我很难准确理解您要做什么,因此我无法提供有关您更普遍地使用泛型的指导。
您的 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
约束必须是约束声明中的第一个)。