I apologise that this is going to be so much code but you can create a string based type safe enum and the only way to demonstrate it working is to provide a working example.
The class
public sealed class Frequency : IEnumeration, IComparable
Which we declare in our POCO as
public Frequency chargeFrequency { get; set; }
And in the map file something like this - note that we map to the value
property of the Frequency
class
this.Property(t => t.chargeFrequency.Value)
.HasColumnName("chargeFrequency")
.HasColumnType("varchar")
.IsOptional()
.HasMaxLength(25);
It works a treat.
x.chargeFrequency = Frequency.Annually
The only drawback is that intellisense can't figure it out for us.
The static portion of the class
private static readonly Dictionary<string, Frequency> _list =
new Dictionary<string, Frequency>();
public static bool Contains(string key)
{
return _list.Any(x => x.Key == key);
}
public static bool operator !=(Frequency a, Frequency b)
{
return (!a.Equals(b));
}
public static bool operator ==(Frequency a, Frequency b)
{
return (a.Equals(b));
}
public static implicit operator Frequency(string value)
{
if (value == null || value.Trim().Length == 0) return Frequency.Null;
if (Contains(value))
return _list[value];
else
throw new InvalidCastException(string.Format("Frequency.{0} not found.", value));
}
public static implicit operator String(Frequency item)
{
return item.Value;
}
public static readonly Frequency Null = new Frequency("");
public static readonly Frequency Annually = new Frequency("Annually");
public static readonly Frequency Fortnightly = new Frequency("Fortnightly");
public static readonly Frequency FourWeekly = new Frequency("FourWeekly");
public static readonly Frequency HalfYearly = new Frequency("HalfYearly");
public static readonly Frequency Monthly = new Frequency("Monthly");
public static readonly Frequency Quarterly = new Frequency("Quarterly");
The instance portion of the class
private readonly string _value;
private readonly bool _readonly;
private Frequency _instance;
private Frequency(string value)
{
_readonly = true;
_value = value;
_instance = this;
_list[value] = _instance;
}
public Frequency()
{
_readonly = false;
_instance = Frequency.Null;
}
[XmlText]
public string Value
{
get
{
if (_instance == Frequency.Null) return null;
return _instance._value;
}
set
{
if (_readonly)
throw new InvalidOperationException("Cannot assign a value to an enumeration.");
if (value == null) _instance = Frequency.Null;
else
{
if (!_list.ContainsKey(value))
throw new NullReferenceException(string.Format("Frequency.{0} not found.", value));
_instance = _list[value];
}
}
}
public override string ToString()
{
return Value;
}
public override bool Equals(object obj)
{
if (obj == null) return false;
if (this.GetType() != obj.GetType()) return false;
// safe because of the GetType check
Frequency item = (Frequency)obj;
return System.Object.ReferenceEquals(_instance, item);
}
public override int GetHashCode()
{
if (_value == null) return "".GetHashCode();
else return _value.GetHashCode();
}
public int CompareTo(object obj)
{
if (obj is Frequency)
{
if (_value == null)
{
if (obj == null) return 0;
else return -1;
}
Frequency compare = (Frequency)obj;
return _instance.Value.CompareTo(compare.Value);
}
else
throw new ArgumentException("Object is not a Frequency.");
}