示例#1
0
        public static void RegisterMetadata(Type customMetadataType)
        {
            ExTraceGlobals.ActivityContextTracer.TraceDebug <string>(0L, "ActivityContext.RegisterMetadata - adding to the list of supported ActivityContext keys, type {0}.", customMetadataType.Name);
            if (!customMetadataType.IsSubclassOf(typeof(Enum)))
            {
                try
                {
                    throw new ArgumentException(DiagnosticsResources.ExceptionActivityContextEnumMetadataOnly, "customMetadataType");
                }
                catch (ArgumentException)
                {
                }
                return;
            }
            Array          values         = Enum.GetValues(customMetadataType);
            ListDictionary listDictionary = new ListDictionary();

            lock (ActivityContext.registeredEnumTypes)
            {
                if (!ActivityContext.registeredEnumTypes.Contains(customMetadataType) && !(customMetadataType == typeof(ActivityReadonlyMetadata)))
                {
                    for (int i = 0; i < values.Length; i++)
                    {
                        Enum   @enum = (Enum)values.GetValue(i);
                        string text  = DisplayNameAttribute.GetEnumName(@enum);
                        if (ActivityContext.stringToEnum.ContainsKey(text))
                        {
                            text = @enum.GetType().FullName + "." + @enum.ToString();
                            if (ActivityContext.stringToEnum.ContainsKey(text))
                            {
                                try
                                {
                                    throw new ActivityContextException(DiagnosticsResources.ExceptionActivityContextKeyCollision);
                                }
                                catch (ActivityContextException)
                                {
                                }
                                return;
                            }
                        }
                        listDictionary.Add(@enum, text);
                    }
                    Dictionary <Enum, Enum>   dictionary  = new Dictionary <Enum, Enum>(ActivityContext.preBoxedEnumValues);
                    Dictionary <Enum, string> dictionary2 = new Dictionary <Enum, string>(ActivityContext.enumToString);
                    Dictionary <string, Enum> dictionary3 = new Dictionary <string, Enum>(ActivityContext.stringToEnum);
                    foreach (object obj2 in listDictionary)
                    {
                        DictionaryEntry dictionaryEntry = (DictionaryEntry)obj2;
                        ExTraceGlobals.ActivityContextTracer.TraceDebug(0L, "ActivityContext.RegisterMetadata - ({0}, '{1}').", new object[]
                        {
                            dictionaryEntry.Key,
                            dictionaryEntry.Value
                        });
                        Enum enum2 = (Enum)dictionaryEntry.Key;
                        dictionary2[enum2] = (string)dictionaryEntry.Value;
                        dictionary3[(string)dictionaryEntry.Value] = enum2;
                        dictionary[enum2] = enum2;
                    }
                    ActivityContext.preBoxedEnumValues = dictionary;
                    ActivityContext.stringToEnum       = dictionary3;
                    ActivityContext.enumToString       = dictionary2;
                    ActivityContext.registeredEnumTypes.Add(customMetadataType);
                }
            }
        }