基类的字段属性在读取时用于派生类

时间:2014-07-26 01:36:46

标签: c# architecture polymorphism filehelpers

我正在尝试正确使用多态来避免大量的额外代码,但文件引擎似乎会抛出错误,就好像它使用基类而不是派生类一样。

理想情况:

  • 创建一个读基类
  • 用户上传文件,并从下拉列表中选择文件类型
  • 下拉列表启动派生类,该类在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;
}

派生类读者类:

[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属性,它似乎从基类中提取,但我不是当然可以。

我愿意接受任何有关我可以派生出来的基类的建议。

2 个答案:

答案 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