我正在重写我们的平面文件解析器,从非通用的,属性导向的东西到更现代的流畅的synstax thingy。我有一个问题想出一个处理浮点数的好方法
鉴于此DTO
public class Foo
{
public decimal DecimalValue { get; set; }
}
这个平面文件
1234561234
您可以像这样配置
Mapper.CreateMap<Foo>()
.Map(f => f.DecimalValue)
.Decimal(10, 4); //Length 10, precision 4
反序列化
var result = Mapper<Foo>.Read(flatfile);
它将生成一个foo对象,其属性值为123456.1234
我有这个工作代码,但它只对十进制值进行硬编码。 我正试图找到一个很好的通用方法。一个问题是浮点数没有通用的constaint。
以上示例中的通用Map
方法
public PropertyMapResult<TType, TProperty> Map<TProperty>(Expression<Func<TType, TProperty>> expression)
{
var result = new PropertyMapResult<TType, TProperty>(this, expression);
propertyMappers.Add(result);
return result;
}
问题方法Decimal
看起来像这样
public MapResult<TType> Decimal(int length, int precision)
{
this.length = length;
toFormater = s => (TProperty)FormatDecimal(s, precision);
fromFormater = property => string.Empty; //TODO: fix Writing of decimal, also fix support for double and float
return parent;
}
及其基础FormatDecimal
private object FormatDecimal(string data, int precision)
{
var integer = ConvertTo<decimal>(data);
var frac = (decimal)Math.Pow(10, precision);
return integer/frac;
}
一种方法是重载以上所有的方法,每个浮点数类型一个,不是非常优化。我尝试使用FormatDecimal
方法进行动态投射,但这没有帮助
有什么想法吗?