允許我建議走行爲類的路線而不是枚舉。您將完全消除開關語句,並有能力逐項關聯元數據和行爲。
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