我不确定我是否完全错过了这里的东西,但我找不到任何方法来确定参数是否通过引用传递,或者不使用反射.
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)
Rob*_*los 12
ParameterType.IsByRef将返回true两者ref 和 out参数.
如果你有一个ParameterInfo对象(例如来自MethodInfo.GetParameters()),那么:
outifparameterInfo.ParameterType.IsByRef && parameterInfo.IsOutrefifparameterInfo.ParameterType.IsByRef && parameterInfo.IsOut == false如果你不IsByRef检查out参数,那么你将错误地获取用[Out]属性装饰的成员,System.Runtime.InteropServices但实际上不是C#out参数.
您需要进一步检查参数的类型.例如,如果你有
void Foo(ref int bar)
Run Code Online (Sandbox Code Playgroud)
然后参数的名称将不是int或Int32(正如您可能预期的那样)而是Int32&.对于每种类型,都有一个对应的by-ref-type,其中原始类型后缀为'&'.您可以通过班级的IsByRef财产来查看Type.