C#-将变量类型传递给泛型方法

C#-将变量类型传递给泛型方法,c#,generics,npoi,C#,Generics,Npoi,我使用NPOI获取此代码。 我正在尝试使对象成为HSSFWorkbook或XSSFWorkbook,具体取决于excel文件的版本 可以使用类型并将其传递给泛型方法,以便强制转换,然后返回HSSFWorkbook或XSSFWorkbook 如果它能工作,我将以不同的方法使用GetWorkBook() 请看我对构造函数的评论 public class ExcelReader { public ExcelReader(filePath) { var isXls

我使用NPOI获取此代码。
我正在尝试使对象成为
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();
}