1

私は次の記録を持っています(簡潔にするために縮小しています):

 [DelimitedRecord(",")]
    [IgnoreFirst]
    [IgnoreEmptyLines()]
    public class ImportRecord
    {
        [FieldQuoted]
        [FieldTrim(TrimMode.Both)]
        public string FirstName;

        [FieldQuoted]
        [FieldTrim(TrimMode.Both)]
        public string LastName;

        [FieldQuoted]
        [FieldTrim(TrimMode.Both)]
        [FieldOptional]
        [FieldConverter(typeof(TestPropertyConverter))]
        public int[] TestProperty;    
    }

コンバーターコード:

  public class TestPropertyConverter : ConverterBase
    {
        public override object StringToField(string from)
        {
              var ret = from.Split('|').Select(x => Convert.ToInt32(x)).ToArray();
              return ret;
        }
    }

したがって、レコードの例は次のようになります: John, Smith, 1|2|3|4

値 1、2、3、4 が展開され、TestProperty 配列が満たされることが期待されます。ただし、次の例外が発生します。

ソース配列の少なくとも 1 つの要素が、宛先配列型にキャストできませんでした。

私はコードにデバッグしようとしましたが、関数から戻ろうとする FieldBase.cs 内の ExtractFieldValue() 関数で爆発するようです。次の行が原因のようです。

res.ToArray(ArrayType);

「res」変数が目的の型の配列であることを期待しているようですが、配列自体の要素が 1 つ含まれています。

私がこれを間違っているのか、それとも可能な修正をしているのか、誰かが提案できますか?

4

3 に答える 3

2

コンバーターを書く必要はありません。最後のフィールドのフィールド区切り文字を変更するだけです。次の例が機能します。

[DelimitedRecord(",")]
//[IgnoreFirst]
[IgnoreEmptyLines()]
public class ImportRecord
{
    [FieldQuoted]
    [FieldTrim(TrimMode.Both)]
    public string FirstName;

    [FieldQuoted]
    [FieldTrim(TrimMode.Both)]
    public string LastName;

    [FieldQuoted]
    [FieldTrim(TrimMode.Both)]
    [FieldOptional]
    [FieldDelimiter("|")] // <-- here 
    public int[] TestProperty;
}

class Program
{
    static void Main(string[] args)
    {
        var engine = new FileHelperEngine<ImportRecord>();
        string fileAsString = @"John, Smith, 1|2|3|4" + Environment.NewLine;
        ImportRecord[] validRecords = engine.ReadString(fileAsString);
        Assert.AreEqual("John", validRecords[0].FirstName);
        Assert.AreEqual("Smith", validRecords[0].LastName);
        Assert.AreEqual(new int[] { 1, 2, 3, 4 }, validRecords[0].TestProperty);
        Console.ReadKey();
    }
}
于 2012-06-25T08:29:53.220 に答える