Как разыменовать ParameterType для параметров, переданных ref
У меня есть следующий фрагмент кода (это просто пример, чтобы указать на мою проблему, решение которой я нахожу):
public class Test
{
public enum myEnum
{
myEnum1,
myEnum2,
}
public static void Refer(out int a, int b, out int[] intArray, bool[] boolArray, myEnum enumerated1, out myEnum enumerated2)
{
a = b;
intArray = new int[] { 1, 2, 3 };
enumerated2 = enumerated1;
}
static void Main()
{
MethodInfo method = typeof(Test).GetMethod("Refer");
ParameterInfo[] parameters = method.GetParameters();
foreach (ParameterInfo parameter in parameters)
{
Console.WriteLine("Type of {0} is {1}", parameter.Name, parameter.ParameterType.Name);
Console.WriteLine("{0} is passed by ref : {1}", parameter.Name, parameter.ParameterType.IsByRef ? "Yes" : "No");
Console.WriteLine("{0} is a primitive type: {1}", parameter.Name, parameter.ParameterType.IsPrimitive ? "Yes" : "No");
Console.WriteLine("{0} is an array : {1}", parameter.Name, parameter.ParameterType.IsArray ? "Yes" : "No");
Console.WriteLine("{0} is an enumeration : {1}", parameter.Name, parameter.ParameterType.IsEnum ? "Yes" : "No");
Console.WriteLine();
}
Console.ReadKey();
}
}
То, где я застреваю, находится в случае справочных параметров. В выходных данных я вижу, когда параметр передается по ссылке, но я не вижу, является ли тип параметра, на который указывает ссылка, например, массивом примитивного типа.
Я хотел бы получить информацию относительно типа того, на что ссылается ссылка. Чтобы сделать это, я предполагаю, что мне как-то нужно разыменовать параметр, но я не могу понять, как это сделать (например, в этом примере я хотел бы видеть этот параметр "int a" IsPrimitive (после разыменования).
Так что вопрос в том, как разыменовать ссылку?
2 ответа
Если тип byref, используйте GetElementType()
на нем, чтобы получить базовый тип без ссылки.
static void Main()
{
MethodInfo method = typeof(Test).GetMethod("Refer");
ParameterInfo[] parameters = method.GetParameters();
foreach (ParameterInfo parameter in parameters)
{
Type paramType = parameter.ParameterType;
Console.WriteLine("Type of {0} is {1}", parameter.Name, paramType.Name);
Console.WriteLine("{0} is passed by ref : {1}", parameter.Name, paramType.IsByRef ? "Yes" : "No");
// extracting element type (works for arrays, too)
if (paramType.IsByRef)
paramType = paramType.GetElementType();
// this will print Yes for a ref int
Console.WriteLine("{0} is a primitive type: {1}", parameter.Name, paramType.IsPrimitive ? "Yes" : "No");
// ...
}
}