代码之家  ›  专栏  ›  技术社区  ›  Ahmad

如何更新对象值(基于当前先前的模式)?

  •  0
  • Ahmad  · 技术社区  · 14 年前

    假设您有一个具有以下简化结构的csv文件

     LINE1:  ID,Description,Value
     LINE2:  1,Product1,2
     LINE3:  ,,3
     LINE4:  ,,4
     LINE5:  2,Product2,2
     LINE6:  ,,3
     LINE7:  ,,5 
    

    我正在使用FileHelpers读取csv,并连接了一个接口,允许我在读取后访问当前行。参考此 SO question 了解更多背景。

    问题是,使用这种方法,我需要写更多的东西 if 语句检查所有需要复制的字段。(目前我至少有6个具有相同“空白”格式的csv文件,所有这些文件都有20多个字段需要复制~120 如果 声明。乌尔格

    现在这不是一个微观优化练习,因为将有更多的文件具有这种“不完整”的格式。

    如何以优雅的方式更新以前的记录,以便不必为每个字段编写if条件和声明?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Ahmad    14 年前

    当前的解决方案是使用名为 CopyMe 然后使用反射进行复制。

    [DelimitedRecord(",") ]
    [IgnoreFirst(1)] 
    public class Product
    {
    
        [CopyMe()] public int ID { get; set; }
        [CopyMe()] public string Description { get; set; }
    
        [FieldConverter(ConverterKind.Decimal)]
        public decimal Val{ get; set; }
    }
    

    后读方法看起来是这样的…

    public void AfterRead(AfterReadEventArgs<RawVolsDataPoints> e)
    {
        var record = (Product)e.Record;
    
        if (PreviousRecord == null)
        {
            PreviousRecord = new Product();
             PreviousRecord = record;
        }
    
        if (String.IsNullOrEmpty(record.ID)) // null value indicates a new row
        {
            var ttype = typeof(Product);
            var fields = ttype.GetFields();
    
            var fieldsToCopy = fields.Where(field =>
                field.GetCustomAttributes(typeof(CopyMeAttribute), true).Any());
    
            foreach (var item in fieldsToCopy)
            {
                var prevvalue = item.GetValue(PreviousRecord);
                item.SetValue(record, prevvalue);
             }
        }
    }