2010-03-27 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mcs / class / corlib / System.Reflection / CustomAttributeData.cs
index 2ebf4cfef7b7ab22226e8380775ed8abe9525cc3..74eaf7d04c158feaf5b91b3a221e839d0ee6ddfd 100644 (file)
@@ -27,8 +27,6 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_2_0
-
 using System;
 using System.Collections.Generic;
 using System.Runtime.CompilerServices;
@@ -39,11 +37,22 @@ namespace System.Reflection {
 
        [ComVisible (true)]
        [Serializable]
-       public sealed class CustomAttributeData {
+#if NET_4_0
+       public
+#else
+       public sealed
+#endif
+       class CustomAttributeData {
                ConstructorInfo ctorInfo;
                IList<CustomAttributeTypedArgument> ctorArgs;
                IList<CustomAttributeNamedArgument> namedArgs;
 
+#if NET_4_0
+               protected CustomAttributeData ()
+               {
+               }
+#endif
+
                internal CustomAttributeData (ConstructorInfo ctorInfo, object [] ctorArgs, object [] namedArgs)
                {
                        this.ctorInfo = ctorInfo;
@@ -56,19 +65,32 @@ namespace System.Reflection {
                }
 
                [ComVisible (true)]
-               public ConstructorInfo Constructor {
+               public
+#if NET_4_0
+               virtual
+#endif
+               ConstructorInfo Constructor {
                        get {
                                return ctorInfo;
                        }
                }
 
-               public IList<CustomAttributeTypedArgument> ConstructorArguments {
+               [ComVisible (true)]
+               public
+#if NET_4_0
+               virtual
+#endif
+               IList<CustomAttributeTypedArgument> ConstructorArguments {
                        get {
                                return ctorArgs;
                        }
                }
 
-               public IList<CustomAttributeNamedArgument> NamedArguments {
+               public
+#if NET_4_0
+               virtual
+#endif
+               IList<CustomAttributeNamedArgument> NamedArguments {
                        get {
                                return namedArgs;
                        }
@@ -94,7 +116,7 @@ namespace System.Reflection {
                {
                        StringBuilder sb = new StringBuilder ();
 
-                       sb.Append ("[" + ctorInfo.DeclaringType.Name + " (");
+                       sb.Append ("[" + ctorInfo.DeclaringType.FullName + "(");
                        for (int i = 0; i < ctorArgs.Count; i++) {
                                sb.Append (ctorArgs [i].ToString ());
                                if (i + 1 < ctorArgs.Count)
@@ -122,9 +144,42 @@ namespace System.Reflection {
 
                        return retval;
                }
+
+               public override bool Equals (object obj)
+               {
+                       CustomAttributeData other = obj as CustomAttributeData;
+                       if (other == null || other.ctorInfo != ctorInfo ||
+                           other.ctorArgs.Count != ctorArgs.Count ||
+                           other.namedArgs.Count != namedArgs.Count)
+                               return false;
+                       for (int i = 0; i < ctorArgs.Count; i++)
+                               if (ctorArgs [i].Equals (other.ctorArgs [i]))
+                                       return false;
+                       for (int i = 0; i < namedArgs.Count; i++) {
+                               bool matched = false;
+                               for (int j = 0; j < other.namedArgs.Count; j++)
+                                       if (namedArgs [i].Equals (other.namedArgs [j])) {
+                                               matched = true;
+                                               break;
+                                       }
+                               if (!matched)
+                                       return false;
+                       }
+                       return true;
+               }
+
+               public override int GetHashCode ()
+               {
+                       int ret = ctorInfo.GetHashCode () << 16;
+                       // argument order-dependent
+                       for (int i = 0; i < ctorArgs.Count; i++)
+                               ret += ret ^ 7 + ctorArgs [i].GetHashCode () << (i * 4);
+                       // argument order-independent
+                       for (int i = 0; i < namedArgs.Count; i++)
+                               ret += (namedArgs [i].GetHashCode () << 5);
+                       return ret;
+               }
        }
 
 }
 
-#endif
-