78 lines
2.6 KiB
C#
78 lines
2.6 KiB
C#
|
//------------------------------------------------------------------------------
|
||
|
// <copyright file="GenericEnumConverter.cs" company="Microsoft">
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
// </copyright>
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.IO;
|
||
|
using System.Reflection;
|
||
|
using System.Security.Permissions;
|
||
|
using System.Xml;
|
||
|
using System.Collections.Specialized;
|
||
|
using System.Globalization;
|
||
|
using System.ComponentModel;
|
||
|
using System.Security;
|
||
|
using System.Text;
|
||
|
|
||
|
namespace System.Configuration {
|
||
|
|
||
|
public sealed class GenericEnumConverter : ConfigurationConverterBase {
|
||
|
private Type _enumType;
|
||
|
|
||
|
public GenericEnumConverter(Type typeEnum) {
|
||
|
if (typeEnum == null) {
|
||
|
throw new ArgumentNullException("typeEnum");
|
||
|
}
|
||
|
|
||
|
_enumType = typeEnum;
|
||
|
}
|
||
|
|
||
|
public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type) {
|
||
|
Debug.Assert(typeof(System.Enum).IsAssignableFrom(value.GetType()), "typeof(System.Enum).IsAssignableFrom(value.GetType())");
|
||
|
|
||
|
return value.ToString();
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|