2 // support.cs: Support routines to work around the fact that System.Reflection.Emit
3 // can not introspect types that are being constructed
6 // Miguel de Icaza (miguel@ximian.com)
8 // (C) 2001 Ximian, Inc (http://www.ximian.com)
11 using System.Reflection.Emit;
12 using System.Reflection;
18 public interface ParameterData {
19 Type ParameterType (int pos);
21 string ParameterDesc (int pos);
22 Parameter.Modifier ParameterModifier (int pos);
25 public class ReflectionParameters : ParameterData {
27 bool last_arg_is_params;
29 public ReflectionParameters (ParameterInfo [] pi)
35 int count = pi.Length-1;
37 a = pi [count-1].GetCustomAttributes (TypeManager.param_array_type, false);
40 last_arg_is_params = true;
44 public Type ParameterType (int pos)
46 return pi [pos].ParameterType;
49 public string ParameterDesc (int pos)
51 StringBuilder sb = new StringBuilder ();
59 if (pos == pi.Length - 1)
60 sb.Append ("params ");
62 sb.Append (TypeManager.CSharpName (ParameterType (pos)));
64 return sb.ToString ();
68 public Parameter.Modifier ParameterModifier (int pos)
71 return Parameter.Modifier.OUT;
73 if (pos == pi.Length-1)
74 if (last_arg_is_params)
75 return Parameter.Modifier.PARAMS;
77 return Parameter.Modifier.NONE;
88 public class InternalParameters : ParameterData {
91 Parameters parameters;
93 public InternalParameters (TypeContainer tc, Parameters parameters)
95 this.param_types = parameters.GetParameterInfo (tc);
96 this.parameters = parameters;
101 if (param_types == null)
104 return param_types.Length;
108 public Type ParameterType (int pos)
110 if (param_types == null)
113 int len = parameters.FixedParameters.Length;
117 p = parameters.ArrayParameter;
119 p = parameters.FixedParameters [pos];
121 p = parameters.ArrayParameter;
125 Type t = param_types [pos];
126 string name = t.FullName;
128 if (p.ModFlags == Parameter.Modifier.REF ||
129 p.ModFlags == Parameter.Modifier.OUT)
130 t = Type.GetType (name.Substring (0, name.Length - 1));
135 public string ParameterDesc (int pos)
140 if (pos == parameters.FixedParameters.Length)
141 p = parameters.ArrayParameter;
143 p = parameters.FixedParameters [pos];
145 if (p.ModFlags == Parameter.Modifier.REF)
147 else if (p.ModFlags == Parameter.Modifier.OUT)
149 else if (p.ModFlags == Parameter.Modifier.PARAMS)
152 Type t = ParameterType (pos);
154 return tmp + TypeManager.CSharpName (t);
157 public Parameter.Modifier ParameterModifier (int pos)
159 if (pos == parameters.FixedParameters.Length)
160 return parameters.ArrayParameter.ModFlags;
162 return parameters.FixedParameters [pos].ModFlags;