Я пытаюсь создать сопоставитель, чтобы PetaPoco могла гидратировать и сохранять POCO со свойствами класса перечисления. Подробнее о классах перечисления см. здесь или здесь.
Например, возьмите этот класс.
public class PetType : Headspring.Enumeration<PetType>
{
public static readonly PetType Frog = new PetType(1, "Frog");
public static readonly PetType Cat = new PetType(2, "Cat");
public static readonly PetType Fish = new PetType(3, "Fish");
public static readonly PetType Dog = new PetType(4, "Dog");
private PetType(int value, string displayName) : base(value, displayName) { }
}
Что можно использовать так:
var MyPet = PetType.Dog;
Вот Poco, который я хочу гидратировать/сохранять с помощью базы данных:
public class Pet
{
public int ID { get; set; }
public string OwnerName { get; set; }
public DateTime DateOfBirth { get; set; }
public string PetName{ get; set; }
public PetType PetType{ get; set; }
}
Я разработал собственный маппер, который будет работать с PetType:
class EnumClassMapper : PetaPoco.StandardMapper
{
public override Func<object, object> GetFromDbConverter(System.Reflection.PropertyInfo targetProperty, Type sourceType)
{
if (targetProperty.PropertyType == typeof(PetType))
{
return (x) => PetType.FromValue((int) x);
}
return base.GetFromDbConverter(targetProperty, sourceType);
}
public override Func<object, object> GetToDbConverter(System.Reflection.PropertyInfo sourceProperty)
{
if (sourceProperty.PropertyType == typeof(PetType))
{
return (x) => ((PetType)x).Value;
}
return base.GetToDbConverter(sourceProperty);
}
}
Однако предположим, что я создаю еще один подкласс Enumeration для размещения.
public class Disposition: Headspring.Enumeration<Disposition>
{
public static readonly Friendly = new Disposition(1, "Friendly");
public static readonly Timid = new Disposition(2, "Timid");
public static readonly Aggressive = new Disposition(3, "Aggressive");
private Disposition(int value, string displayName) : base(value, displayName) { }
}
Я не хочу обновлять свой преобразователь каждый раз, когда создаю новый подкласс класса Enumeration. Я предпочитаю, чтобы код отображения мог распознавать, что тип свойства является потомком класса Enumeration, и соответствующим образом отображать его. Я предполагаю, что ответ заключается в использовании отражения, но я не знаю, как поступить.