public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data) {
object result = null;
//
// For any error, throw the ArgumentException with SR.Invalid_enum_value
//
try {
string value = (string)data;
if (String.IsNullOrEmpty(value)) {
throw new Exception();
}
// Disallow numeric values for enums.
if (!String.IsNullOrEmpty(value) &&
(Char.IsDigit(value[0]) ||
(value[0] == '-') ||
(value[0] == '+'))) {
throw new Exception();
}
if (value != value.Trim()) { // throw if the value has whitespace
throw new Exception();
}
result = Enum.Parse(_enumType, value);
}
catch {
StringBuilder names = new StringBuilder();
foreach (string name in Enum.GetNames(_enumType)) {
if (names.Length != 0) {
names.Append(", ");
}
names.Append(name);
}
throw new ArgumentException(SR.GetString(SR.Invalid_enum_value, names.ToString()));
}
return result;
}
}