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 {
28 public ReflectionParameters (ParameterInfo [] pi)
33 public Type ParameterType (int pos)
35 return pi [pos].ParameterType;
38 public string ParameterDesc (int pos)
40 StringBuilder sb = new StringBuilder ();
48 sb.Append (TypeManager.CSharpName (ParameterType (pos)));
50 return sb.ToString ();
54 public Parameter.Modifier ParameterModifier (int pos)
57 return Parameter.Modifier.OUT;
59 return Parameter.Modifier.NONE;
70 public class InternalParameters : ParameterData {
73 Parameters parameters;
75 public InternalParameters (TypeContainer tc, Parameters parameters)
77 this.param_types = parameters.GetParameterInfo (tc);
78 this.parameters = parameters;
83 if (param_types == null)
86 return param_types.Length;
90 public Type ParameterType (int pos)
92 if (param_types == null)
97 if (pos == parameters.FixedParameters.Length)
98 p = parameters.ArrayParameter;
100 p = parameters.FixedParameters [pos];
102 Type t = param_types [pos];
103 string name = t.FullName;
105 if (p.ModFlags == Parameter.Modifier.REF ||
106 p.ModFlags == Parameter.Modifier.OUT)
107 t = Type.GetType (name.Substring (0, name.Length - 1));
112 public string ParameterDesc (int pos)
117 if (pos == parameters.FixedParameters.Length)
118 p = parameters.ArrayParameter;
120 p = parameters.FixedParameters [pos];
122 if (p.ModFlags == Parameter.Modifier.REF)
124 else if (p.ModFlags == Parameter.Modifier.OUT)
126 else if (p.ModFlags == Parameter.Modifier.PARAMS)
129 Type t = ParameterType (pos);
131 return tmp + TypeManager.CSharpName (t);
134 public Parameter.Modifier ParameterModifier (int pos)
136 if (pos == parameters.FixedParameters.Length)
137 return parameters.ArrayParameter.ModFlags;
139 return parameters.FixedParameters [pos].ModFlags;