我強烈建議您使用的選項組固定的,而不是自由文本用戶輸入轉換爲0/1。
但是如果您必須有一種可能性是使用自定義屬性。 所以它看起來會是這樣的:
enum Gender
{
[Synonyms("f","female","FL")]
female=0,
[Synonyms("m","male","ML")]
male=1,
}
屬性看起來應該是這樣的:
public sealed class Synonyms: Attribute
{
private readonly string[] values;
public AbbreviationAttribute(params string[] i_Values)
{
this.values = i_Values;
}
public string Values
{
get { return this.values; }
}
}
然後使用一個通用的方法來檢索您的可能的同義詞
public static R GetAttributeValue<T, R>(IConvertible @enum)
{
R attributeValue = default(R);
if (@enum != null)
{
FieldInfo fi = @enum.GetType().GetField(@enum.ToString());
if (fi != null)
{
T[] attributes = fi.GetCustomAttributes(typeof(T), false) as T[];
if (attributes != null && attributes.Length > 0)
{
IAttribute<R> attribute = attributes[0] as IAttribute<R>;
if (attribute != null)
{
attributeValue = attribute.Value;
}
}
}
}
return attributeValue;
}
然後使用上面的方法檢索數組中的值數組並比較用戶輸入。
編輯: 如果前面一些原因,你必須枚舉值進不去,就沒有其他的選擇,如果...否則,而不是使用...語句只是一定要封裝了登錄界面,在一個單獨的功能或類別根據可重用性要求。
public eGender getEnumFrom UserInput(string i_userInput)
{
if(i_userInput == "male") then return eGender.male;
if(i_userInput == "m") then return eGender.male;
if(i_userInput == "ML") then return eGender.male;
....
}
你可以使用StartWith對嗎?或者像輸入中的自動完成/搜索功能 – arifnpm
@arifnpm:爲什麼我應該使用StartWith?找到沒有理由去做 –
也許你可以在擴展方法中實現自定義分析邏輯? http://kirillosenkov.blogspot.com/2007/09/making-c-enums-more-usable-parse-method.html – Arie