Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ public CsvHelperTypeConverterForCustomType()

public string ConvertToString(CsvHelperTypeConversion.TypeConverterOptions options, object value)
{
return converter.ConvertToString(value);
return converter.ConvertToString(value, null);
}

public object ConvertFromString(CsvHelperTypeConversion.TypeConverterOptions options, string text)
{
return converter.ConvertFromString(text);
return converter.ConvertFromString(text, null);
}

public bool CanConvertFrom(Type type)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
namespace FlatFile.Benchmark.Converters
{
using System;
using System.Reflection;
using FlatFile.Benchmark.Entities;
using FlatFile.Core;

Expand All @@ -16,13 +17,13 @@ public bool CanConvertTo(Type type)
return type == typeof (CustomType);
}

public string ConvertToString(object source)
public string ConvertToString(object source, PropertyInfo sourceProperty)
{
var obj = (CustomType)source;
return string.Format("{0}|{1}|{2}", obj.First, obj.Second, obj.Third);
}

public object ConvertFromString(string source)
public object ConvertFromString(string source, PropertyInfo targetProperty)
{
var values = source.Split('|');

Expand Down
2 changes: 1 addition & 1 deletion src/FlatFile.Core/Base/FlatFileEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public abstract class FlatFileEngine<TFieldSettings, TLayoutDescriptor> : IFlatF
/// Gets the line builder.
/// </summary>
/// <value>The line builder.</value>
protected abstract ILineBulder LineBuilder { get; }
protected abstract ILineBuilder LineBuilder { get; }

/// <summary>
/// Gets the line parser.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
namespace FlatFile.Core.Base
{
public abstract class LineBulderBase<TLayoutDescriptor, TFieldSettings> : ILineBulder
public abstract class LineBuilderBase<TLayoutDescriptor, TFieldSettings> : ILineBuilder
where TLayoutDescriptor : ILayoutDescriptor<TFieldSettings>
where TFieldSettings : IFieldSettingsContainer
{
private readonly TLayoutDescriptor _descriptor;

protected LineBulderBase(TLayoutDescriptor descriptor)
protected LineBuilderBase(TLayoutDescriptor descriptor)
{
this._descriptor = descriptor;
}
Expand All @@ -21,7 +21,7 @@ protected TLayoutDescriptor Descriptor
protected virtual string GetStringValueFromField(TFieldSettings field, object fieldValue)
{
string lineValue = fieldValue != null
? fieldValue.ToString()
? ConvertToString(field, fieldValue)
: field.NullValue ?? string.Empty;

lineValue = TransformFieldValue(field, lineValue);
Expand All @@ -33,5 +33,14 @@ protected virtual string TransformFieldValue(TFieldSettings field, string lineVa
{
return lineValue;
}

private static string ConvertToString(TFieldSettings field, object fieldValue)
{
var converter = field.TypeConverter;
if (converter != null && converter.CanConvertTo(typeof(string)) && converter.CanConvertFrom(field.PropertyInfo.PropertyType))
return field.TypeConverter.ConvertToString(fieldValue, field.PropertyInfo);

return fieldValue.ToString();
}
}
}
7 changes: 4 additions & 3 deletions src/FlatFile.Core/Base/LineParserBase.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
namespace FlatFile.Core.Base
{
using System;
using System.Reflection;
using FlatFile.Core.Extensions;

public abstract class LineParserBase<TLayoutDescriptor, TFieldSettings> : ILineParser
Expand Down Expand Up @@ -39,7 +40,7 @@ protected virtual object GetFieldValueFromString(TFieldSettings fieldSettings, s

object obj;

if (!fieldSettings.TypeConverter.ConvertFromStringTo(memberValue, type, out obj))
if (!fieldSettings.TypeConverter.ConvertFromStringTo(memberValue, type, fieldSettings.PropertyInfo, out obj))
{
obj = memberValue.Convert(type);
}
Expand All @@ -56,11 +57,11 @@ protected virtual string TransformStringValue(TFieldSettings fieldSettingsBuilde
public static class TypeConverterExtensions
{

public static bool ConvertFromStringTo(this ITypeConverter converter, string source, Type targetType, out object obj)
public static bool ConvertFromStringTo(this ITypeConverter converter, string source, Type targetType, PropertyInfo targetProperty, out object obj)
{
if (converter != null && converter.CanConvertFrom(typeof(string)) && converter.CanConvertTo(targetType))
{
obj = converter.ConvertFromString(source);
obj = converter.ConvertFromString(source, targetProperty);
return true;
}

Expand Down
36 changes: 36 additions & 0 deletions src/FlatFile.Core/Base/TypeConverterBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System;
using System.Reflection;

namespace FlatFile.Core.Base
{
/// <summary>
/// A generic base class for converting between strings and a given type.
/// </summary>
/// <typeparam name="TValue">The type to convert to and from a string.</typeparam>
public abstract class TypeConverterBase<TValue> : ITypeConverter
{
public virtual bool CanConvertFrom(Type type)
{
return type == typeof(string) || type == typeof(TValue);
}

public virtual bool CanConvertTo(Type type)
{
return type == typeof(string) || type == typeof(TValue);
}

public object ConvertFromString(string source, PropertyInfo targetProperty)
{
return ConvertFrom(source, targetProperty);
}

protected abstract TValue ConvertFrom(string source, PropertyInfo targetProperty);

public string ConvertToString(object source, PropertyInfo sourceProperty)
{
return ConvertTo((TValue)source, sourceProperty);
}

protected abstract string ConvertTo(TValue source, PropertyInfo sourceProperty);
}
}
37 changes: 37 additions & 0 deletions src/FlatFile.Core/DelegatingTypeConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System;
using System.Reflection;

namespace FlatFile.Core
{
/// <summary>
/// An implementation of <see cref="ITypeConverter"/> that uses delegates for conversion.
/// </summary>
class DelegatingTypeConverter<TProperty> : ITypeConverter
{
internal Func<string, TProperty> ConversionFromString { get; set; }

internal Func<TProperty, string> ConversionToString { get; set; }

public bool CanConvertFrom(Type type)
{
return (type == typeof(string) && ConversionFromString != null) ||
(type == typeof(TProperty) && ConversionToString != null);
}

public bool CanConvertTo(Type type)
{
return (type == typeof(string) && ConversionToString != null) ||
(type == typeof(TProperty) && ConversionFromString != null);
}

public object ConvertFromString(string source, PropertyInfo targetProperty)
{
return ConversionFromString(source);
}

public string ConvertToString(object source, PropertyInfo sourceProperty)
{
return ConversionToString((TProperty)source);
}
}
}
6 changes: 4 additions & 2 deletions src/FlatFile.Core/FlatFile.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,10 @@
<Compile Include="Base\FlatFileEngine.cs" />
<Compile Include="Base\LayoutBase.cs" />
<Compile Include="Base\LayoutDescriptorBase.cs" />
<Compile Include="Base\LineBulderBase.cs" />
<Compile Include="Base\LineBuilderBase.cs" />
<Compile Include="Base\LineParserBase.cs" />
<Compile Include="Base\TypeConverterBase.cs" />
<Compile Include="DelegatingTypeConverter.cs" />
<Compile Include="Exceptions\ParseLineException.cs" />
<Compile Include="Extensions\ExpressionExtensions.cs" />
<Compile Include="Extensions\FieldsSettingsExtensions.cs" />
Expand All @@ -117,7 +119,7 @@
<Compile Include="ILayout.cs" />
<Compile Include="ILayoutDescriptor.cs" />
<Compile Include="ILineBuilderFactory.cs" />
<Compile Include="ILineBulder.cs" />
<Compile Include="ILineBuilder.cs" />
<Compile Include="ILineParser.cs" />
<Compile Include="ILineParserFactory.cs" />
<Compile Include="ITypeConverter.cs" />
Expand Down
3 changes: 3 additions & 0 deletions src/FlatFile.Core/IFieldSettingsConstructor.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
namespace FlatFile.Core
{
using FlatFile.Core.Base;
using System;

public interface IFieldSettingsConstructor<out TConstructor> : IFieldSettingsContainer
where TConstructor : IFieldSettingsConstructor<TConstructor>
{
TConstructor AllowNull(string nullValue);
TConstructor WithTypeConverter<TConverter>() where TConverter : ITypeConverter;
TConstructor WithConversionFromString<TProperty>(Func<string, TProperty> conversion);
TConstructor WithConversionToString<TProperty>(Func<TProperty, string> conversion);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace FlatFile.Core
{
public interface ILineBulder
public interface ILineBuilder
{
string BuildLine<T>(T entry);
}
Expand Down
2 changes: 1 addition & 1 deletion src/FlatFile.Core/ILineBuilderFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace FlatFile.Core
public interface ILineBuilderFactory<out TBuilder, in TLayout, TFieldSettings>
where TFieldSettings : IFieldSettings
where TLayout : ILayoutDescriptor<TFieldSettings>
where TBuilder : ILineBulder
where TBuilder : ILineBuilder
{
TBuilder GetBuilder(TLayout layout);
}
Expand Down
5 changes: 3 additions & 2 deletions src/FlatFile.Core/ITypeConverter.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
namespace FlatFile.Core
{
using System;
using System.Reflection;

public interface ITypeConverter
{
bool CanConvertFrom(Type type);

bool CanConvertTo(Type type);

string ConvertToString(object source);
string ConvertToString(object source, PropertyInfo sourceProperty);

object ConvertFromString(string source);
object ConvertFromString(string source, PropertyInfo targetProperty);
}
}
2 changes: 1 addition & 1 deletion src/FlatFile.Delimited/IDelimitedLineBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{
using FlatFile.Core;

public interface IDelimitedLineBuilder : ILineBulder
public interface IDelimitedLineBuilder : ILineBuilder
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ internal DelimitedFileMultiEngine(
/// <value>The line builder.</value>
/// <remarks>The <see cref="DelimitedFileMultiEngine"/> does not contain just a single line builder.</remarks>
/// <exception cref="System.NotImplementedException"></exception>
protected override ILineBulder LineBuilder { get { throw new NotImplementedException(); } }
protected override ILineBuilder LineBuilder { get { throw new NotImplementedException(); } }

/// <summary>
/// Gets the line parser.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
namespace FlatFile.Delimited.Implementation
{
using System;
using System.Reflection;
using FlatFile.Core;
using FlatFile.Core.Extensions;
Expand All @@ -25,6 +26,32 @@ public IDelimitedFieldSettingsConstructor WithTypeConverter<TConverter>() where
return this;
}

public IDelimitedFieldSettingsConstructor WithConversionFromString<TProperty>(Func<string, TProperty> conversion)
{
if (TypeConverter == null)
TypeConverter = new DelegatingTypeConverter<TProperty>();

if (TypeConverter is DelegatingTypeConverter<TProperty>)
((DelegatingTypeConverter<TProperty>)TypeConverter).ConversionFromString = conversion;
else
throw new InvalidOperationException("A type converter has already been explicitly set.");

return this;
}

public IDelimitedFieldSettingsConstructor WithConversionToString<TProperty>(Func<TProperty, string> conversion)
{
if (TypeConverter == null)
TypeConverter = new DelegatingTypeConverter<TProperty>();

if (TypeConverter is DelegatingTypeConverter<TProperty>)
((DelegatingTypeConverter<TProperty>)TypeConverter).ConversionToString = conversion;
else
throw new InvalidOperationException("A type converter has already been explicitly set.");

return this;
}

public IDelimitedFieldSettingsConstructor WithName(string name)
{
Name = name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ internal DelimitedFileEngine(
/// Gets the line builder.
/// </summary>
/// <value>The line builder.</value>
protected override ILineBulder LineBuilder
protected override ILineBuilder LineBuilder
{
get { return _builderFactory.GetBuilder(LayoutDescriptor); }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using FlatFile.Core.Base;

public class DelimitedLineBuilder :
LineBulderBase<IDelimitedLayoutDescriptor, IDelimitedFieldSettingsContainer>,
LineBuilderBase<IDelimitedLayoutDescriptor, IDelimitedFieldSettingsContainer>,
IDelimitedLineBuilder
{
public DelimitedLineBuilder(IDelimitedLayoutDescriptor descriptor)
Expand Down
2 changes: 1 addition & 1 deletion src/FlatFile.FixedLength/IFixedLengthLineBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ namespace FlatFile.FixedLength
{
using FlatFile.Core;

public interface IFixedLengthLineBuilder : ILineBulder
public interface IFixedLengthLineBuilder : ILineBuilder
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,31 @@ public IFixedFieldSettingsConstructor WithTypeConverter<TConverter>() where TCon
this.TypeConverter = ReflectionHelper.CreateInstance<TConverter>(true);
return this;
}

public IFixedFieldSettingsConstructor WithConversionFromString<TProperty>(Func<string, TProperty> conversion)
{
if (TypeConverter == null)
TypeConverter = new DelegatingTypeConverter<TProperty>();

if (TypeConverter is DelegatingTypeConverter<TProperty>)
((DelegatingTypeConverter<TProperty>)TypeConverter).ConversionFromString = conversion;
else
throw new InvalidOperationException("A type converter has already been explicitly set.");

return this;
}

public IFixedFieldSettingsConstructor WithConversionToString<TProperty>(Func<TProperty, string> conversion)
{
if (TypeConverter == null)
TypeConverter = new DelegatingTypeConverter<TProperty>();

if (TypeConverter is DelegatingTypeConverter<TProperty>)
((DelegatingTypeConverter<TProperty>)TypeConverter).ConversionToString = conversion;
else
throw new InvalidOperationException("A type converter has already been explicitly set.");

return this;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ internal FixedLengthFileEngine(
/// Gets the line builder.
/// </summary>
/// <value>The line builder.</value>
protected override ILineBulder LineBuilder
protected override ILineBuilder LineBuilder
{
get { return lineBuilderFactory.GetBuilder(LayoutDescriptor); }
}
Expand Down
Loading