基类上的字段属性在派生类中读取时使用
本文关键字:读取 派生 字段 属性 基类 | 更新日期: 2023-09-27 18:15:02
我试图正确使用多态性以避免大量额外的代码,但是文件引擎似乎抛出错误,好像它正在使用基类而不是派生类。
理想情况:
- 创建一个读基类
- 用户上传文件,并从下拉菜单中选择文件类型
- 下拉菜单启动一个派生类,它在FileHelpers库中用于读取上传的文件
我不确定如何在这个实例中正确使用多态性,因为文件助手库需要您从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;
}
派生类读取器Class:
[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
属性,并且它似乎从基类中拉出,但我不确定为什么。
我愿意接受任何建议,有一个基类,我可以从。
您正在复制派生类中的字段。类已经继承了所有这些成员。如果您的问题是需要将不同的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; }
}
棘手的部分是如何与你正在使用的"FileHelpers"库一起工作。理想情况下,您希望使您的字段私有,具有公共属性,但我不确定您是否可以将这些FieldTrim
和其他属性应用于私有字段,或应用于属性,这将是您的两个选项。
我还建议重新考虑一下这里是否真的需要多态性。您打算引用UploadedFileBase
的异构集合吗?或者你只是为了"花哨"而实现这些东西?特别是,您设计带有公共字段的抽象类的方式并不是非常好的设计。如果可以改进设计,最好先实现具体类,然后再把看到的冗余推到基类或接口中。
你隐藏了你的基类属性,因此当你引用它们时,你没有得到你需要的值。
您需要将virtual
关键字添加到基类上所有属性的前面。当你在AmexBaseRead中重新定义它们时,你实际上是在复制它们。
有关详细解释,请参阅以下MSDN文章:http://msdn.microsoft.com/en-us/library/ms173152.aspx