如何解引用通过ref传递的参数ParameterType

本文关键字:参数 ParameterType ref 何解 引用 | 更新日期: 2023-09-27 18:10:00

我有以下代码片段(这只是一个例子,指出我的问题,我正在寻找一个解决方案):

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(解引用后)。

那么问题是,如何解引用?

如何解引用通过ref传递的参数ParameterType

如果一个类型是byref,使用GetElementType()来获取底层的非ref类型

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");
        // ...
    }
}