Строки AutoMapper для перечисления описаний
Учитывая требование:
Возьмите граф объекта, установите все свойства типа enum на основе обработанного значения свойства второй строки. Соглашение предписывает, что именем свойства строки источника будет имя свойства enum с постфиксом "Raw".
Под обработкой мы подразумеваем, что нам нужно удалить заданные символы и т.д.
Я смотрел на пользовательские средства форматирования, преобразователи значений и преобразователи типов, ни один из которых не кажется решением для этого?
Мы хотим использовать AutoMapper в отличие от нашей собственной процедуры отражения по двум причинам: а) он широко используется в остальной части проекта и б) он дает вам рекурсивный обход.
-- Пример --
Учитывая (простую) структуру ниже, и это:
var tmp = new SimpleClass
{
CountryRaw = "United States",
Person = new Person { GenderRaw="Male" }
};
var tmp2 = new SimpleClass();
Mapper.Map(tmp, tmp2);
мы ожидаем, что перечисление MampCountry в tmp2 будет иметь значение Country.UnitedStates, а свойство Person будет иметь пол Gender.Male.
public class SimpleClass1
{
public string CountryRaw {get;set;}
public Country MappedCountry {get;set;}
public Person Person {get;set;}
}
public class Person
{
public string GenderRaw {get;set;}
public Gender Gender {get;set;}
public string Surname {get;set;}
}
public enum Country
{
UnitedStates = 1,
NewZealand = 2
}
public enum Gender
{
Male,
Female,
Unknown
}
Спасибо
1 ответ
Я сделал это с ValueInjecter, вот и все:
Я добавил еще одну опору в SimpleClass, чтобы показать вам, как она работает.
public class SixFootUnderTest
{
[Test]
public void Test()
{
var o = new SimpleClass1
{
CountryRaw = "United States",
GenderRaw = "Female",
Person = new Person { GenderRaw = "Male" }
};
var oo = new SimpleClass1();
oo.InjectFrom(o)
.InjectFrom<StrRawToEnum>(o);
oo.Person.InjectFrom<StrRawToEnum>(o.Person);
oo.Country.IsEqualTo(Country.UnitedStates);
oo.Gender.IsEqualTo(Gender.Female);
oo.Person.Gender.IsEqualTo(Gender.Male);
}
public class SimpleClass1
{
public string CountryRaw { get; set; }
public Country Country { get; set; }
public string GenderRaw { get; set; }
public Gender Gender { get; set; }
public Person Person { get; set; }
}
public class Person
{
public string GenderRaw { get; set; }
public Gender Gender { get; set; }
public string Surname { get; set; }
}
public class StrRawToEnum : LoopValueInjection
{
protected override bool UseSourceProp(string sourcePropName)
{
return sourcePropName.EndsWith("Raw");
}
protected override string TargetPropName(string sourcePropName)
{
return sourcePropName.RemoveSuffix("Raw");
}
protected override bool TypesMatch(Type sourceType, Type targetType)
{
return sourceType == typeof(string) && targetType.IsEnum;
}
protected override object SetValue(object sourcePropertyValue)
{
return Enum.Parse(TargetPropType, sourcePropertyValue.ToString().Replace(" ", ""), true);
}
}
public enum Country
{
UnitedStates = 1,
NewZealand = 2
}
public enum Gender
{
Male,
Female,
Unknown
}
}
также в случае, если вам нужно сделать это из CountryRaw в MappedCountry, вы можете сделать это следующим образом:
oo.InjectFrom(new StrRawToEnum().TargetPrefix("Mapped"), o);