Search code examples
c#filehelpers

Multiple Date in FileHelpers how?


I am wondering how do I do multiple dates in filehelpers? It seems that you must specify every single format you are going to support (what kinda sucks...wish it could handle more of the basic ones).

   [FieldOrder(1), FieldConverter(ConverterKind.DateMultiFormat, "MM/dd/yyyy", "MM/d/yyyy", "M/d/yyyy","M/dd/yyyy")]

This gives me though

Error   35  Argument 1: cannot convert from 'FileHelpers.ConverterKind' to 'System.Type'    

So it seems I have to make some custom convert or something? Is this correct?

Edit

I am using version 2.9.9.0

Options

// Summary:
//     Indicates the FileHelpers.ConverterKind used for read/write operations.
//
// Remarks:
//     See the Complete attributes list for more information and examples of each
//     one.
[AttributeUsage(AttributeTargets.Field)]
public sealed class FieldConverterAttribute : Attribute
{
    // Summary:
    //     Indicates the FileHelpers.ConverterKind used for read/write operations.
    //
    // Parameters:
    //   converter:
    //     The FileHelpers.ConverterKind used for the transformations.
    public FieldConverterAttribute(ConverterKind converter);
    //
    // Summary:
    //     Indicates a custom FileHelpers.ConverterBase implementation.
    //
    // Parameters:
    //   customConverter:
    //     The Type of your custom converter.
    public FieldConverterAttribute(Type customConverter);
    //
    // Summary:
    //     Indicates the FileHelpers.ConverterKind used for read/write operations.
    //
    // Parameters:
    //   converter:
    //     The FileHelpers.ConverterKind used for the transformations.
    //
    //   arg1:
    //     The first param passed directly to the Converter Constructor.
    public FieldConverterAttribute(ConverterKind converter, string arg1);
    //
    // Summary:
    //     Indicates a custom FileHelpers.ConverterBase implementation.
    //
    // Parameters:
    //   customConverter:
    //     The Type of your custom converter.
    //
    //   args:
    //     A list of params passed directly to your converter constructor.
    public FieldConverterAttribute(Type customConverter, params object[] args);
    //
    // Summary:
    //     Indicates a custom FileHelpers.ConverterBase implementation.
    //
    // Parameters:
    //   customConverter:
    //     The Type of your custom converter.
    //
    //   arg1:
    //     The first param passed directly to the Converter Constructor.
    public FieldConverterAttribute(Type customConverter, string arg1);
    //
    // Summary:
    //     Indicates the FileHelpers.ConverterKind used for read/write operations.
    //
    // Parameters:
    //   converter:
    //     The FileHelpers.ConverterKind used for the transformations.
    //
    //   arg1:
    //     The first param passed directly to the Converter Constructor.
    //
    //   arg2:
    //     The second param passed directly to the Converter Constructor.
    public FieldConverterAttribute(ConverterKind converter, string arg1, string arg2);
    //
    // Summary:
    //     Indicates a custom FileHelpers.ConverterBase implementation.
    //
    // Parameters:
    //   customConverter:
    //     The Type of your custom converter.
    //
    //   arg1:
    //     The first param passed directly to the Converter Constructor.
    //
    //   arg2:
    //     The second param passed directly to the Converter Constructor.
    public FieldConverterAttribute(Type customConverter, string arg1, string arg2);
    //
    // Summary:
    //     Indicates the FileHelpers.ConverterKind used for read/write operations.
    //
    // Parameters:
    //   converter:
    //     The FileHelpers.ConverterKind used for the transformations.
    //
    //   arg1:
    //     The first param passed directly to the Converter Constructor.
    //
    //   arg2:
    //     The second param passed directly to the Converter Constructor.
    //
    //   arg3:
    //     The third param passed directly to the Converter Constructor.
    public FieldConverterAttribute(ConverterKind converter, string arg1, string arg2, string arg3);
    //
    // Summary:
    //     Indicates a custom FileHelpers.ConverterBase implementation.
    //
    // Parameters:
    //   customConverter:
    //     The Type of your custom converter.
    //
    //   arg1:
    //     The first param passed directly to the Converter Constructor.
    //
    //   arg2:
    //     The second param passed directly to the Converter Constructor.
    //
    //   arg3:
    //     The third param passed directly to the Converter Constructor.
    public FieldConverterAttribute(Type customConverter, string arg1, string arg2, string arg3);
}

Solution

  • There is no overload with parameters FieldConverterAttribute(ConverterKind, params string[]).

    There is one with FieldConverterAttribute(ConverterKind, string, string, string) so you can supply up to 3 formats.

    If you need more than that, then you can create your own converter:

    public class CustomDateTimeConverter : ConverterBase
    {
        public CustomDateTimeConverter(string format1, string format2, string format3, string format4)
        {
            _FormatStrings = new string[] { format1, format2, format3, format4} ;
        }
    
        private string[] _FormatStrings;
    
        public override object StringToField(string from)
        {
            foreach (string formatString in _FormatStrings)
            {
                DateTime dt;
                if (DateTime.TryParseExact(from, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
                    return dt;
            }
            throw new ConvertException(from, typeof(DateTime));
        }
    }
    

    And then your field would look like

    [FieldConverter(typeof(CustomDateTimeConverter), "MM/dd/yyyy", "MM/d/yyyy", "M/d/yyyy", "M/dd/yyyy")]
    public DateTime Field1;