C#-将变量类型传递给泛型方法
我使用NPOI获取此代码。C#-将变量类型传递给泛型方法,c#,generics,npoi,C#,Generics,Npoi,我使用NPOI获取此代码。 我正在尝试使对象成为HSSFWorkbook或XSSFWorkbook,具体取决于excel文件的版本 可以使用类型并将其传递给泛型方法,以便强制转换,然后返回HSSFWorkbook或XSSFWorkbook 如果它能工作,我将以不同的方法使用GetWorkBook() 请看我对构造函数的评论 public class ExcelReader { public ExcelReader(filePath) { var isXls
我正在尝试使对象成为
HSSFWorkbook
或XSSFWorkbook
,具体取决于excel文件的版本
可以使用类型
并将其传递给泛型方法,以便强制转换,然后返回HSSFWorkbook
或XSSFWorkbook
如果它能工作,我将以不同的方法使用GetWorkBook()
请看我对构造函数的评论
public class ExcelReader
{
public ExcelReader(filePath)
{
var isXls = Path.GetExtension(_filePath) == ".xls";
// Is the following possible or is there any work around to get it work.
var type = isXls ? HSSFWorkbook : XSSFWorkbook;
var workbook = GetWorkBook<type>();
// Other init...
}
public T GetWorkBook<T>()
{
return (T)Workbook.GetSheetAt();
}
}
公共类ExcelReader
{
公共ExcelReader(文件路径)
{
var isXls=Path.GetExtension(_filePath)==“.xls”;
//以下是可能的,还是有什么办法可以让它工作。
变量类型=isXls?HSSF工作簿:XSSF工作簿;
var workbook=GetWorkBook();
//其他初始化。。。
}
公共T get工作簿()
{
return(T)Workbook.GetSheetAt();
}
}
泛型需要在编译时具有类型。因此,在正常情况下,不能将类型
动态传递给泛型方法
不过,您可以使用它(使用反射
)
在您的情况下,一个更简单的选择是不使用泛型
铸造成所需的类型
HSSFWorkbook hSSFWorkbook = null;
XSSFWorkbook xSSFWorkbook = null;
if (isXls)
hSSFWorkbook = (HSSFWorkbook)workBook;
else
xSSFWorkbook = (XSSFWorkbook)workBook;
理想的方法是拥有一个基础接口或类,HSSFWorkbook和XSSFWorkbook都从中继承。那就有
public IInterface GetWorkBook<T>()
{
return Workbook.GetSheetAt();
}
public IInterface get工作簿()
{
返回工作簿。GetSheetAt();
}
并按要求铸造
但是如果您不能控制这些类,那么可以使用dynamic
public dynamic GetWorkBook<T>()
{
return Workbook.GetSheetAt();
}
public动态get工作簿()
{
返回工作簿。GetSheetAt();
}
但是,在开始这条路线之前,一定要阅读动态方面的内容。为什么不这样简单地更改实现呢
public ExcelReader(filePath)
{
var isXls = Path.GetExtension(_filePath) == ".xls";
if(typeof(isXls) == typeof(HSSFWorkbook))
var workbook= GetWorkBook<HSSFWorkbook>();
else if(typeof(isXls) == typeof(XSSFWorkbook))
var workbook= GetWorkBook<XSSFWorkbook >();
else{}
}
public T GetWorkBook<T>()
{
if(typeof(T) == typeof(HSSFWorkbook)
return (T)(object)(HSSFWorkbook)Workbook.GetSheetAt();
return (T)(object)(XSSFWorkbook)Workbook.GetSheetAt();
}
publicExcelReader(文件路径)
{
var isXls=Path.GetExtension(_filePath)==“.xls”;
if(类型(isXls)=类型(HSSF工作手册))
var workbook=GetWorkBook();
else if(typeof(isXls)=typeof(xssf工作簿))
var workbook=GetWorkBook();
else{}
}
公共T get工作簿()
{
if(类型(T)=类型(HSSF工作手册)
返回(T)(对象)(HSSF工作簿)工作簿。GetSheetAt();
return(T)(object)(XSSFWorkbook)Workbook.GetSheetAt();
}
只需根据您的类型使用条件语句。我想我大部分时间都会使用工作簿上继承NPOI提供的HSSFWorkbook
和XSSFWorkbook
的接口,如果我需要专门用于XSSFWorkbook
的方法,我会将该接口转换为XSSFWorkbook
。顺便说一句,谢谢在这种情况下,您的代码将看起来非常类似于替代方法。只需将对象替换为您的接口。它需要强制转换才能使用HSSF或XSSF方法。在我回答的最后一部分中,我也显示了强制转换部分。
public dynamic GetWorkBook<T>()
{
return Workbook.GetSheetAt();
}
public ExcelReader(filePath)
{
var isXls = Path.GetExtension(_filePath) == ".xls";
if(typeof(isXls) == typeof(HSSFWorkbook))
var workbook= GetWorkBook<HSSFWorkbook>();
else if(typeof(isXls) == typeof(XSSFWorkbook))
var workbook= GetWorkBook<XSSFWorkbook >();
else{}
}
public T GetWorkBook<T>()
{
if(typeof(T) == typeof(HSSFWorkbook)
return (T)(object)(HSSFWorkbook)Workbook.GetSheetAt();
return (T)(object)(XSSFWorkbook)Workbook.GetSheetAt();
}