Added Mono.Tasklets test
[mono.git] / mcs / class / corlib / System.Reflection / PropertyInfo.cs
1 //
2 // System.Reflection/PropertyInfo.cs
3 //
4 // Author:
5 //   Paolo Molaro (lupus@ximian.com)
6 //
7 // (C) 2001 Ximian, Inc.  http://www.ximian.com
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
9 //
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:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
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.
28 //
29
30 using System.Diagnostics;
31 using System.Globalization;
32 using System.Runtime.InteropServices;
33 using System.Runtime.CompilerServices;
34
35 namespace System.Reflection {
36
37         [ComVisible (true)]
38         [ComDefaultInterfaceAttribute (typeof (_PropertyInfo))]
39         [Serializable]
40         [ClassInterface(ClassInterfaceType.None)]
41 #if MOBILE
42         public abstract class PropertyInfo : MemberInfo {
43 #else
44         public abstract class PropertyInfo : MemberInfo, _PropertyInfo {
45 #endif
46                 public abstract PropertyAttributes Attributes { get; }
47                 public abstract bool CanRead { get; }
48                 public abstract bool CanWrite { get; }
49                 
50                 public virtual MethodInfo GetMethod {
51                         get { return GetGetMethod(true); }
52                 }
53
54                 public virtual MethodInfo SetMethod {
55                         get { return GetSetMethod(true); }
56                 }
57
58                 public bool IsSpecialName {
59                         get {return (Attributes & PropertyAttributes.SpecialName) != 0;}
60                 }
61
62                 public override MemberTypes MemberType {
63                         get {return MemberTypes.Property;}
64                 }
65                 public abstract Type PropertyType { get; }
66         
67                 protected PropertyInfo () { }
68
69                 public MethodInfo[] GetAccessors ()
70                 {
71                         return GetAccessors (false);
72                 }
73                 
74                 public abstract MethodInfo[] GetAccessors (bool nonPublic);
75
76                 public MethodInfo GetGetMethod()
77                 {
78                         return GetGetMethod (false);
79                 }
80                 public abstract MethodInfo GetGetMethod(bool nonPublic);
81                 
82                 public abstract ParameterInfo[] GetIndexParameters();
83
84                 public MethodInfo GetSetMethod()
85                 {
86                         return GetSetMethod (false);
87                 }
88                 
89                 public abstract MethodInfo GetSetMethod (bool nonPublic);
90                 
91                 [DebuggerHidden]
92                 [DebuggerStepThrough]
93                 public virtual object GetValue (object obj, object[] index)
94                 {
95                         return GetValue(obj, BindingFlags.Default, null, index, null);
96                 }
97
98                 [DebuggerHidden]
99                 [DebuggerStepThrough]
100                 public object GetValue (object obj)
101                 {
102                         return GetValue(obj, BindingFlags.Default, null, null, null);
103                 }
104
105                 public abstract object GetValue (object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture);
106                 
107                 [DebuggerHidden]
108                 [DebuggerStepThrough]
109                 public virtual void SetValue (object obj, object value, object[] index)
110                 {
111                         SetValue (obj, value, BindingFlags.Default, null, index, null);
112                 }
113
114                 [DebuggerHidden]
115                 [DebuggerStepThrough]
116                 public void SetValue (object obj, object value)
117                 {
118                         SetValue (obj, value, BindingFlags.Default, null, null, null);
119                 }
120
121                 public abstract void SetValue (object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture);
122
123                 public virtual Type[] GetOptionalCustomModifiers () {
124                         return Type.EmptyTypes;
125                 }
126
127                 public virtual Type[] GetRequiredCustomModifiers () {
128                         return Type.EmptyTypes;
129                 }
130
131                 static NotImplementedException CreateNIE ()
132                 {
133                         return new NotImplementedException ();
134                 }
135
136                 public virtual object GetConstantValue () {
137                         throw CreateNIE ();
138                 }
139
140                 public virtual object GetRawConstantValue() {
141                         throw CreateNIE ();
142                 }
143
144                 public override bool Equals (object obj)
145                 {
146                         return obj == (object) this;
147                 }
148
149                 public override int GetHashCode ()
150                 {
151                         return base.GetHashCode ();
152                 }
153
154                 public static bool operator == (PropertyInfo left, PropertyInfo right)
155                 {
156                         if ((object)left == (object)right)
157                                 return true;
158                         if ((object)left == null ^ (object)right == null)
159                                 return false;
160                         return left.Equals (right);
161                 }
162
163                 public static bool operator != (PropertyInfo left, PropertyInfo right)
164                 {
165                         if ((object)left == (object)right)
166                                 return false;
167                         if ((object)left == null ^ (object)right == null)
168                                 return true;
169                         return !left.Equals (right);
170                 }
171
172 #if !MOBILE
173                 void _PropertyInfo.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
174                 {
175                         throw new NotImplementedException ();
176                 }
177
178                 Type _PropertyInfo.GetType ()
179                 {
180                         // Required or object::GetType becomes virtual final
181                         return base.GetType ();
182                 }               
183
184                 void _PropertyInfo.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
185                 {
186                         throw new NotImplementedException ();
187                 }
188
189                 void _PropertyInfo.GetTypeInfoCount (out uint pcTInfo)
190                 {
191                         throw new NotImplementedException ();
192                 }
193
194                 void _PropertyInfo.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
195                 {
196                         throw new NotImplementedException ();
197                 }
198 #endif
199         }
200 }