// 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;
[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;
}
[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;
}
{
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)
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
-