繁体   English   中英

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

[英]C# - Pass a variable type to Generic method

我有使用NPOI的代码。
我试图根据Excel文件的版本,将其作为HSSFWorkbookXSSFWorkbook的对象。

可以具有Type并将其HSSFWorkbook到泛型方法中,以便进行铸造,然后返回HSSFWorkbookXSSFWorkbook

而且,如果GetWorkBook() ,我将以其他方法使用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();
    }
}

泛型需要在编译时具有Type 因此,通常无法将Type动态传递给泛型方法。

您可以使用它(使用reflection

public ExcelReader(filePath)
{
    var isXls = Path.GetExtension(_filePath) == ".xls";
    var type = isXls ? typeof(HSSFWorkbook) : typeof(XSSFWorkbook); //get the type for the method

    var getWorkBook = this.GetType().GetMethod("GetWorkBook"); //get the generic method dynamically
    var genericGetWorkBook = getWorkBook.MakeGenericMethod(type); //use the type

    var workBook = genericGetWorkBook.Invoke(this, null); //call the method
    //Other init...
}

在您的情况下,更简单的选择是不使用泛型

public ExcelReader(filePath)
{
    var isXls = Path.GetExtension(_filePath) == ".xls";
    var workBook = GetWorkBook(); //then cast or return object directly
    //Other init...
}

public object GetWorkBook()
{        
    return 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 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();
}

只需根据您的类型使用条件语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM