我有一个C#抽象类,我正在使用它作为一种接口
public abstract class ExcelParser
{
protected FileInfo fileInfo { get; set; }
protected bool FileIsValidExcelFile()...
protected virtual string GetCellValue(int row, int column)...
protected virtual int GetColumnLocation(string columnHeader)...
public abstract IEnumerable<T> Parse();
}
我的问题是T方法的抽象IEnumerable,Parse()。
我的问题是我希望该方法返回特定类型的IEnumerable,但我并不关心该类型在抽象级别。我只希望继承类具体关于返回的IEnumerable。
忽略这不会编译的事实,我遇到的另一个问题是表示层中的执行。
private string BuildSql(string fileName, bool minifySqlText, bool productCodeXref)
{
string result = string.Empty;
ISqlBuilder sqlBuilder;
ExcelParser excelParser;
try
{
if (productCodeXref)
{
excelParser = new ProductCodeXrefExcelParser(fileName);
var productCodeXrefs = excelParser.Parse();
sqlBuilder = new ProductCodeXrefSqlBuilder(productCodeXrefs)
}
else
{
excelParser = new VendorExcelParser(fileName);
var vendors = excelParser.Parse();
sqlBuilder = new VendorSqlBuilder(vendors);
}
result = sqlBuilder.GetSql();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "USER ERROR",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
return result;
}
这是目前表示层中的一个粗略实现,但我不知道这是否会起作用。我提出这个的原因是因为我有另一个ExcelParser实现编译,但这需要我具体说明ExcelParser是什么......
ExcelParser<Vendor>
......这完全违背了这样做的目的。
我知道这是因为我尝试了以下链接的类似解决方案,但是我的类/接口要求我指定类型。 =&GT; How do i return IEnumerable<T> from a method
有没有办法 1)在抽象类或接口中有一个方法返回一个IE的数量,但是当它被实现时不关心那个类型是什么,并且 2)确保接口/抽象类不关心Parse方法将返回什么类型?
答案 0 :(得分:1)
有没有办法
1)在抽象类或接口中有一个方法返回
IEnumerable<T>
,但在实现时不关心该类型是什么2)确保接口/抽象类不关心Parse方法将返回什么类型?
是 - 使抽象类具有通用性:
public abstract class ExcelParser<T>
具体类看起来像:
public class VendorExcelParser : ExcelParser<Vendor>
并包含将从Excel数据创建Vendor
个实例的逻辑 - 尽可能利用基本抽象方法。
答案 1 :(得分:0)
你必须以某种方式为要实现的T类型指定类型:它必须能够被隐式确定(例如,通过用法:Foo.Get<T>(T input), Foo.Get("")
,或静态确定的例如。{{ 1}}
如果您的表示层无法知道类型,那么我不知道您打算如何使用泛型类这样做。 Foo.Get<vendor>()
需要以某种方式返回一个类型。可能你可以使用一个接口在这里完成预期的功能:如果返回的对象将坚持各种模式,那么你不必关心类型是什么,只是它符合接口。
根据您的使用情况,.Parse()
可能合适?