允许我建议走行为类的路线而不是枚举。您将完全消除开关语句,并有能力逐项关联元数据和行为。
public class Gender
{
private static readonly Dictionary<string, Gender> _items = new Dictionary<string, Gender>();
public static readonly Gender Male = new Gender("M", "he", age => age >= 14);
public static readonly Gender Female = new Gender("F", "she", age => age >= 13);
public static readonly Gender Unknown = new Gender("U", "he/she", age => null);
public string DatabaseKey { get; private set; }
public string Pronoun { get; private set; }
public Func<int, bool?> CanGetMarriedInTexas { get; set; }
private Gender(string databaseKey, string pronoun, Func<int,bool?> canGetMarriedInTexas)
{
DatabaseKey = databaseKey;
Pronoun = pronoun;
CanGetMarriedInTexas = canGetMarriedInTexas;
_items.Add(databaseKey, this);
}
public static Gender GetForDatabaseKey(string databaseKey)
{
if (databaseKey == null)
{
return Unknown;
}
Gender gender;
if (!_items.TryGetValue(databaseKey, out gender))
{
return Unknown;
}
return gender;
}
public IEnumerable<Gender> All()
{
return _items.Values;
}
}
而不是使用一个开关来获取数据库关键你自讨苦吃的:
public void MapViewToPerson(IEditPersonInfoView view, Person person)
{
person.Gender = view.Gender.DatabaseKey;
// ...
}
您还可以通过简单地问自己希望得到的信息的性别对象应用于特定性别的行为。例如,得克萨斯州的合法结婚年龄与性别有关。
public void MapPersonToView(IEditPersonInfoView view, Person person)
{
Gender gender = Gender.GetForDatabaseKey(person.Gender);
view.Gender = gender;
view.ShowMarriageSection = gender.CanGetMarriedInTexas(person.AgeInYears) ?? true;
// ...
}
好的......但你如何让Linq自动投出“M”给TGender.Male,“F”给TGender.Female等?我不想为“DbGender”(字符串)和“性别”(TGender)分别设置属性 - 字符串属性根本没有用处,我也不想用不必要的接口来污染我的代码。 – 2009-06-23 16:26:11