3

次のコード スニペットがあります (これは、解決策を見つけようとしている問題を指摘するための単なる例です)。

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 (逆参照後) であることを確認したいと思います)。

問題は、参照を逆参照する方法です。

4

2 に答える 2

1

型が byref の場合はGetElementType()、基になる非 ref 型を取得するために使用します。

于 2015-08-26T14:49:54.840 に答える
-1
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");

        // ...
    }
}
于 2015-08-26T14:51:03.930 に答える