如何为 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()
获取底层的非引用类型。
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");
// ...
}
}
我有以下代码片段(这只是指出我正在寻找解决方案的问题的示例):
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()
获取底层的非引用类型。
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");
// ...
}
}