参考参数和反射

Pat*_*gne 31 c# reflection

我不确定我是否完全错过了这里的东西,但我找不到任何方法来确定参数是否通过引用传递,或者不使用反射.

ArgumentInfo有一个属性"IsOut",但没有"IsRef".我如何在给定的MethodInfo中获取所有参考参数?

Rex*_*x M 39

ParameterInfo[] parameters = myMethodInfo.GetParameters();
foreach(ParameterInfo parameter in parameters)
{
    bool isRef = parameterInfo.ParameterType.IsByRef;
}
Run Code Online (Sandbox Code Playgroud)

  • 豪尔赫:你所说的是'IsValueType`,而不是'IsByRef`. (9认同)
  • Jorge:据我所知,"IsByRef"确定一个类型是通过引用传递的,而不是它是一个引用类型.例如,类型System.Object的"IsByRef"为false,但特殊类型System.Object&具有"IsByRef为true. (5认同)
  • 对于`out`参数,`IsByRef`也返回true.有关如何区分,请参阅我对此问题的回答. (3认同)
  • IsByRef只确定Type是引用类型还是值Type,据我所知,它不会告诉你Type是否通过引用传递 (2认同)

Rob*_*los 12

ParameterType.IsByRef将返回true两者ref out参数.

如果你有一个ParameterInfo对象(例如来自MethodInfo.GetParameters()),那么:

  • 参数是outifparameterInfo.ParameterType.IsByRef && parameterInfo.IsOut
  • 参数是refifparameterInfo.ParameterType.IsByRef && parameterInfo.IsOut == false

如果你不IsByRef检查out参数,那么你将错误地获取用[Out]属性装饰的成员,System.Runtime.InteropServices但实际上不是C#out参数.


Chr*_*yer 7

您需要进一步检查参数的类型.例如,如果你有

void Foo(ref int bar)
Run Code Online (Sandbox Code Playgroud)

然后参数的名称将不是intInt32(正如您可能预期的那样)而是Int32&.对于每种类型,都有一个对应的by-ref-type,其中原始类型后缀为'&'.您可以通过班级的IsByRef财产来查看Type.