【问题标题】:How to dereference ParameterType for parameters passed by ref如何为 ref 传递的参数取消引用 ParameterType
【发布时间】:2015-11-20 16:06:53
【问题描述】:

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

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(取消引用之后)。

所以问题是,如何取消引用?

【问题讨论】:

    标签: c# dereference parameterinfo


    【解决方案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");
    
            // ...
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果类型是 byref,则在其上使用GetElementType() 以获取底层的非引用类型。

      【讨论】:

      • 这正是我所需要的。谢谢
      猜你喜欢
      • 2011-01-31
      • 2016-09-29
      • 2014-11-12
      • 2013-07-18
      • 2016-12-07
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多