基类上的字段属性在派生类中读取时使用

本文关键字:读取 派生 字段 属性 基类 | 更新日期: 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