Är det typ en flatfil? Jag skulle separera deserializingen och användad av datat, mao
var dto = FlatFileMapper.Map<MyDto>(stringData);
if(dto.NettingAmount < 0)
//act on negative NettingAmount
Istället för typ
if(decimal.Parse(stringData.Substring(512, 20)) <0)
//act on negative NettingAmount
Exempel två skapar massor med noise som tar fokus från domänen
Jag har skrivit en faltfils parser nyligen för mitt uppdrag, kan tyvärr inte lägga upp den då koden ägs av kunden men jag valde en Fluent synstax mappning istället för Attribute så att man slipper gödsla ner sina DTOer med tråkiga attribute, mao
FlatFileMapper.CreateMap<MyDto>()
.Map(x => x.NettingAmount)
.Length(10);
Istället för
public class MyDto
{
[FlatFileRecord(Length = 10)]
public decimal NettingAmount { get; set; }
}
För att uppnå första exemplet, använd Expressions,
public PropertyMapResult<TType, TProperty> Map<TProperty>(Expression<Func<TType, TProperty>> expression)
{
var result = new PropertyMapResult<TType, TProperty>(this, expression);
propertyMappers.Add(result);
return result;
}
PropertyMapResult är sedan en klass med massor med reflection magi etc för att läsa / skriva från / till properties på objektinstanser
edit: Insåg att det kanske var lite taskigt att helt exkludera kod från PropertyMapper
Den gör i princip
public PropertyMapResult(MapResult<TType> parent, Expression<Func<TType, TProperty>> expression)
{
this.parent = parent;
var member = expression.Body as MemberExpression;
propertyInfo = member.Member as PropertyInfo;
propertyType = GetPropertyType();
}
För att hämta ut typen kan det behövas lite extra logik jag gör såhär för att även stödja nullables (Kan finnas fler edgecases)
private Type GetPropertyType()
{
var type = typeof (TProperty);
if (type.IsGenericType && type.GetGenericTypeDefinition().IsAssignableFrom(typeof (Nullable<>)))
{
return type.GetGenericArguments()[0];
}
return type;
}