[英]C# - Pass a variable type to Generic method
我有使用NPOI的代碼。
我試圖根據Excel文件的版本,將其作為HSSFWorkbook
或XSSFWorkbook
的對象。
可以具有Type
並將其HSSFWorkbook
到泛型方法中,以便進行鑄造,然后返回HSSFWorkbook
或XSSFWorkbook
?
而且,如果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.