//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ namespace System.ServiceModel.Configuration { using System; using System.ComponentModel; using System.Configuration; internal class StandardRuntimeFlagEnumValidator : ConfigurationValidatorBase where TEnum : struct { public StandardRuntimeFlagEnumValidator() { StandardRuntimeFlagEnumValidatorAttribute.ValidateFlagEnumType(typeof(TEnum)); } public override bool CanValidate(Type type) { return (type == typeof(TEnum)); } public override void Validate(object value) { if (!Enum.IsDefined(typeof(TEnum), value)) { TEnum dummy; if (!Enum.TryParse(value.ToString(), true, out dummy)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidEnumArgumentException("value", (int)value, typeof(TEnum))); } int combinedValue = (int)((object)dummy); int[] values = (int[])Enum.GetValues(typeof(TEnum)); if (!StandardRuntimeFlagEnumValidatorAttribute.IsCombinedValue(combinedValue, values, values.Length - 1)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidEnumArgumentException("value", (int)value, typeof(TEnum))); } } } } }