我正在尝试正确使用多态来避免大量的额外代码,但文件引擎似乎会抛出错误,就好像它使用基类而不是派生类一样。
理想情况:
我不确定如何在此实例中正确使用多态,因为文件助手库需要您从CSV中读取字段。
public abstract class UploadedFilebase
{
public string CaseId;
public string ChargeReference;
public Double Amount;
public DateTime ReceivedDate;
public string ReasonCode;
public string ReplyBy;
public string Resolution;
public Double ChargeAmount;
}
派生类读者类:
[DelimitedRecord(","), IgnoreFirst(9), IgnoreLast(1)]
public class AmexBaseRead : UploadedFilebase, IUploadedFileReader
{
[FieldTrim(TrimMode.Left, "'")]
public string CaseId;
[FieldTrim(TrimMode.Left, "'")]
public string ChargeReference;
[FieldTrim(TrimMode.Both, "'($)")]
public new Double Amount;
[FieldTrim(TrimMode.Left, "'")]
[FieldConverter(ConverterKind.Date, "MM/dd/yyyy")]
public DateTime ReceivedDate;
[FieldTrim(TrimMode.Left, "'")]
public string ReasonCode;
[FieldTrim(TrimMode.Left, "'")]
public string ReplyBy;
[FieldTrim(TrimMode.Left, "'")]
public string Resolution;
[FieldTrim(TrimMode.Left, "'$")]
public Double ChargeAmount;
SingleImportResult IUploadedFileReader.ReadFromFile(HttpPostedFileBase fileToRead
{
...
FileHelperEngine<AmexBaseRead> engine = new FileHelperEngine<AmexBaseRead>();
engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;
TextReader tr = new StreamReader(fileToRead.InputStream);
AmexBaseRead[] records = engine.ReadStream(tr);
...
}
}
出于某种原因,当我尝试在filehelpers引擎(上面)中使用我的派生类时,它无法处理FieldTrim
属性,它似乎从基类中提取,但我不是当然可以。
我愿意接受任何有关我可以派生出来的基类的建议。
答案 0 :(得分:1)
您正在复制派生类中的字段。该类已经继承了所有这些成员。如果您的问题是需要将不同的FieldTrim
属性应用于不同的子类,则可以尝试将UploadedFilebase
设为接口:
public interface IUploadedFilebase
{
string CaseId { get; }
string ChargeReference { get; }
Double Amount { get; }
DateTime ReceivedDate { get; }
string ReasonCode { get; }
string ReplyBy { get; }
string Resolution { get; }
Double ChargeAmount { get; }
}
棘手的部分是如何使用&#34; FileHelpers&#34;您正在使用的图书馆。理想情况下,您希望使用公共属性将字段设为私有,但我不确定您是否可以将这些FieldTrim
和其他属性应用于私有字段或属性,这将是您的两个选项。
我还建议你重新考虑一下你是否真的需要多态性。您打算引用UploadedFileBase
的异构集合吗?或者你只是以这种方式实现的目标是&#34;幻想&#34;?特别是,使用公共字段设计抽象类的方式并不是非常好的设计。首先实现具体类可能会更好,然后将您看到的任何冗余推送到基类或接口,如果这样可以改进设计。
答案 1 :(得分:0)
您隐藏了基类属性,因此无论何时引用它们,您都无法获得所需的值。
您需要将virtual
关键字添加到基类的所有属性的前面。当您在AmexBaseRead中重新定义它们时,您基本上会复制它们。
有关详细说明,请查看以下MSDN文章: http://msdn.microsoft.com/en-us/library/ms173152.aspx