簡體   English   中英

如何取消引用ref傳遞的參數的ParameterType

[英]How to dereference ParameterType for parameters passed by 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(在解除引用之后)。

所以問題是,如何取消引用參考?

如果類型是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");

        // ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM