2 // System.Reflection/CustomAttributeData.cs
5 // Zoltan Varga (vargaz@gmail.com)
6 // Carlos Alberto Cortez (calberto.cortez@gmail.com)
8 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System
.Collections
.Generic
;
32 using System
.Runtime
.CompilerServices
;
33 using System
.Runtime
.InteropServices
;
36 namespace System
.Reflection
{
45 class CustomAttributeData
{
46 ConstructorInfo ctorInfo
;
47 IList
<CustomAttributeTypedArgument
> ctorArgs
;
48 IList
<CustomAttributeNamedArgument
> namedArgs
;
51 protected CustomAttributeData ()
56 internal CustomAttributeData (ConstructorInfo ctorInfo
, object [] ctorArgs
, object [] namedArgs
)
58 this.ctorInfo
= ctorInfo
;
60 this.ctorArgs
= Array
.AsReadOnly
<CustomAttributeTypedArgument
>
61 (ctorArgs
!= null ? UnboxValues
<CustomAttributeTypedArgument
> (ctorArgs
) : new CustomAttributeTypedArgument
[0]);
63 this.namedArgs
= Array
.AsReadOnly
<CustomAttributeNamedArgument
>
64 (namedArgs
!= null ? UnboxValues
<CustomAttributeNamedArgument
> (namedArgs
) : new CustomAttributeNamedArgument
[0]);
72 ConstructorInfo Constructor
{
83 IList
<CustomAttributeTypedArgument
> ConstructorArguments
{
93 IList
<CustomAttributeNamedArgument
> NamedArguments
{
99 public static IList
<CustomAttributeData
> GetCustomAttributes (Assembly target
) {
100 return MonoCustomAttrs
.GetCustomAttributesData (target
);
103 public static IList
<CustomAttributeData
> GetCustomAttributes (MemberInfo target
) {
104 return MonoCustomAttrs
.GetCustomAttributesData (target
);
107 public static IList
<CustomAttributeData
> GetCustomAttributes (Module target
) {
108 return MonoCustomAttrs
.GetCustomAttributesData (target
);
111 public static IList
<CustomAttributeData
> GetCustomAttributes (ParameterInfo target
) {
112 return MonoCustomAttrs
.GetCustomAttributesData (target
);
115 public override string ToString ()
117 StringBuilder sb
= new StringBuilder ();
119 sb
.Append ("[" + ctorInfo
.DeclaringType
.FullName
+ "(");
120 for (int i
= 0; i
< ctorArgs
.Count
; i
++) {
121 sb
.Append (ctorArgs
[i
].ToString ());
122 if (i
+ 1 < ctorArgs
.Count
)
126 if (namedArgs
.Count
> 0)
129 for (int j
= 0; j
< namedArgs
.Count
; j
++) {
130 sb
.Append (namedArgs
[j
].ToString ());
131 if (j
+ 1 < namedArgs
.Count
)
134 sb
.AppendFormat (")]");
136 return sb
.ToString ();
139 static T
[] UnboxValues
<T
> (object [] values
)
141 T
[] retval
= new T
[values
.Length
];
142 for (int i
= 0; i
< values
.Length
; i
++)
143 retval
[i
] = (T
) values
[i
];
148 public override bool Equals (object obj
)
150 CustomAttributeData other
= obj
as CustomAttributeData
;
151 if (other
== null || other
.ctorInfo
!= ctorInfo
||
152 other
.ctorArgs
.Count
!= ctorArgs
.Count
||
153 other
.namedArgs
.Count
!= namedArgs
.Count
)
155 for (int i
= 0; i
< ctorArgs
.Count
; i
++)
156 if (ctorArgs
[i
].Equals (other
.ctorArgs
[i
]))
158 for (int i
= 0; i
< namedArgs
.Count
; i
++) {
159 bool matched
= false;
160 for (int j
= 0; j
< other
.namedArgs
.Count
; j
++)
161 if (namedArgs
[i
].Equals (other
.namedArgs
[j
])) {
171 public override int GetHashCode ()
173 int ret
= ctorInfo
.GetHashCode () << 16;
174 // argument order-dependent
175 for (int i
= 0; i
< ctorArgs
.Count
; i
++)
176 ret
+= ret ^
7 + ctorArgs
[i
].GetHashCode () << (i
* 4);
177 // argument order-independent
178 for (int i
= 0; i
< namedArgs
.Count
; i
++)
179 ret
+= (namedArgs
[i
].GetHashCode () << 5);