2 // System.Reflection/MonoProperty.cs
3 // The class used to represent Properties from the mono runtime.
6 // Paolo Molaro (lupus@ximian.com)
7 // Patrik Torstensson (patrik.torstensson@labs2.com)
9 // (C) 2001 Ximian, Inc. http://www.ximian.com
13 using System.Globalization;
14 using System.Runtime.CompilerServices;
15 using System.Runtime.InteropServices;
17 namespace System.Reflection {
19 internal struct MonoPropertyInfo {
22 public MethodInfo get_method;
23 public MethodInfo set_method;
24 public PropertyAttributes attrs;
26 [MethodImplAttribute(MethodImplOptions.InternalCall)]
27 internal static extern void get_property_info (MonoProperty prop, out MonoPropertyInfo info);
30 internal class MonoProperty : PropertyInfo {
31 internal IntPtr klass;
34 public override PropertyAttributes Attributes {
36 MonoPropertyInfo info;
37 MonoPropertyInfo.get_property_info (this, out info);
41 public override bool CanRead {
43 MonoPropertyInfo info;
44 MonoPropertyInfo.get_property_info (this, out info);
45 return (info.get_method != null);
48 public override bool CanWrite {
50 MonoPropertyInfo info;
51 MonoPropertyInfo.get_property_info (this, out info);
52 return (info.set_method != null);
56 public override Type PropertyType {
58 MonoPropertyInfo info;
59 MonoPropertyInfo.get_property_info (this, out info);
61 if (info.get_method != null) {
62 return info.get_method.ReturnType;
64 ParameterInfo[] parameters = info.set_method.GetParameters();
66 return parameters [parameters.Length - 1].ParameterType;
70 public override Type ReflectedType {
72 MonoPropertyInfo info;
73 MonoPropertyInfo.get_property_info (this, out info);
77 public override Type DeclaringType {
79 MonoPropertyInfo info;
80 MonoPropertyInfo.get_property_info (this, out info);
84 public override string Name {
86 MonoPropertyInfo info;
87 MonoPropertyInfo.get_property_info (this, out info);
93 public override MethodInfo[] GetAccessors( bool nonPublic) {
94 // FIXME: check nonPublic
95 MonoPropertyInfo info;
97 MonoPropertyInfo.get_property_info (this, out info);
98 if (info.set_method != null)
100 if (info.get_method != null)
102 MethodInfo[] res = new MethodInfo [n];
104 if (info.set_method != null)
105 res [n++] = info.set_method;
106 if (info.get_method != null)
107 res [n++] = info.get_method;
112 public override MethodInfo GetGetMethod( bool nonPublic) {
113 // FIXME: check nonPublic
114 MonoPropertyInfo info;
115 MonoPropertyInfo.get_property_info (this, out info);
116 return info.get_method;
118 public override ParameterInfo[] GetIndexParameters() {
119 MonoPropertyInfo info;
120 MonoPropertyInfo.get_property_info (this, out info);
121 if (info.get_method != null)
122 return info.get_method.GetParameters ();
123 return new ParameterInfo [0];
125 public override MethodInfo GetSetMethod( bool nonPublic) {
126 // FIXME: check nonPublic
127 MonoPropertyInfo info;
128 MonoPropertyInfo.get_property_info (this, out info);
129 return info.set_method;
131 public override bool IsDefined (Type attributeType, bool inherit) {
132 return MonoCustomAttrs.IsDefined (this, attributeType, inherit);
135 public override object[] GetCustomAttributes( bool inherit) {
136 return MonoCustomAttrs.GetCustomAttributes (this, inherit);
138 public override object[] GetCustomAttributes( Type attributeType, bool inherit) {
139 return MonoCustomAttrs.GetCustomAttributes (this, attributeType, inherit);
142 public override object GetValue( object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) {
145 if (index == null || index.Length == 0) {
146 MethodInfo method = GetGetMethod(false);
148 ret = method.Invoke(obj, invokeAttr, binder, null, culture);
151 // fixme: support indexed parameters..
156 public override void SetValue( object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) {
159 public override string ToString () {
160 return PropertyType.ToString () + " " + Name;