簡體   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