예제 #1
0
        private static string GetClassThumbprint(XmlAttributeOverrides overrides)
        {
            Hashtable types = GetTypesHashtable(overrides);
            // Types are the most significant information
            // in the key ... that why the type info comes first

            // what does the thumbprint of an XmlAttributeOverrides need to
            // consist of?
            // Type names are the key of the outer hashtable
            // The values of the outer hashtable are more hashtables
            // The keys of the inner hashtables are member names. The
            // values of the inner hashtable are XmlAttributes objects.
            // I.e. to create a content-based thumbprint of an
            // XmlAttributeOverrides we need to normalize first the
            // type names, then the member names and finally include the
            // values of each XmlAttributes object in the thumbprint.

            // so my first attempt at a thumbprint looks like this:
            // typeName:memberName:attributes:memberName:attributes:...
            // memberNames are orders alphabetically

            // the complete thumbprint for the XmlAttributeOverrides
            // concatenates the individual thumbrprints for a type in
            // the alphabetical order of the type names.

            StringSorter sorter = new StringSorter();

            foreach (Type t in types.Keys)
            {
                sorter.AddString(t.AssemblyQualifiedName);
            }
            string[] sortedTypeNames = sorter.GetOrderedArray();

            // now we have the types for which we have overriding attributes
            // in alphabetical order

            // TODO
            // Now generate thumbprint for each member of
            // each type
            StringBuilder printBuilder = new StringBuilder();

            foreach (string typeName in sortedTypeNames)
            {
                System.Diagnostics.Debug.WriteLine(string.Format("+++ Starting thumbprint for type {0}", typeName));
                printBuilder.AppendFormat(">>{0}>>", typeName);
                GetTypePrint(typeName, types, printBuilder);
                printBuilder.Append("<<");
                System.Diagnostics.Debug.WriteLine(string.Format("--- Finished thumbprint for type {0}", typeName));
            }
            return(printBuilder.ToString());
        }
예제 #2
0
        /// <summary>
        /// Creates a signature for the passed in Type array. The order
        /// of the elements in the array does not influence the signature.
        /// </summary>
        /// <param name="types"></param>
        /// <returns>An instance indpendent signature of the Type array</returns>
        public static string GetTypeArraySignature(Type[] types)
        {
            string thumbPrint = null;

            if (null != types && types.Length > 0)
            {
                // to make sure we don't account for the order
                // of the types in the array, we create one SortedList
                // with the type names, concatenate them and hash that.
                StringSorter sorter = new StringSorter();
                foreach (Type t in types)
                {
                    sorter.AddString(t.AssemblyQualifiedName);
                }
                thumbPrint = string.Join(":", sorter.GetOrderedArray());
            }
            return(thumbPrint);
        }
예제 #3
0
        private static void GetTypePrint(string typeName, Hashtable attributes, StringBuilder printBuilder)
        {
            Type      t = Type.GetType(typeName);
            Hashtable memberAttributes = attributes[t] as Hashtable;

            System.Diagnostics.Debug.Assert(null != memberAttributes);
            StringSorter sorter = new StringSorter();

            foreach (string memberName in memberAttributes.Keys)
            {
                sorter.AddString(memberName);
            }
            string[] sortedMemberNames = sorter.GetOrderedArray();

            foreach (string memberName in sortedMemberNames)
            {
                printBuilder.AppendFormat("**{0}**", memberName);
                System.Diagnostics.Debug.WriteLine(string.Format("++ Started member thumbprint for type {0}, member:{1}.", typeName, memberName));
                GetXmlAttributesThumbprint(memberAttributes[memberName] as XmlAttributes, printBuilder);
                printBuilder.Append("***");
                System.Diagnostics.Debug.WriteLine(string.Format("-- Finished member thumbprint for type {0}, member:{1}.", typeName, memberName));
            }
        }