[英]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.