我强烈建议使用一组固定的选项而不是自由文本将用户输入转换为 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;
}
然后使用上面的方法检索数组中的值数组并比较用户输入。
编辑:
如果由于某种原因您无法访问枚举值,除了使用 if ... else... 语句之外别无选择,请确保根据可重用性要求将该登录封装在单独的函数或类中.
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;
....
}