我怎么知道参数使用 ref 或 params 修饰符?

How do I know that a parameter uses ref or params modifier?

在 Mono.Cecil 中,ParameterDefinition of an out 参数的 属性 IsOut 设置为 true

ref and params呢?如何根据 ParameterDefinition 确定其中一个修饰符用于方法参数?

虽然 ParameterDefinition 不包含 IsRefIsParams,但很容易从其他两个属性中确定两者。

当参数包含ref修饰符时,ParameterDefinition.ParameterType.IsByReference的值为true。否则就是false,即使实参是引用类型

至于paramsCustomAttributes集合中包含一个对应于System.ParamArrayAttribute的元素。

下面的一段代码说明了如何确定四种状态:

using System;
using System.Linq;
using Mono.Cecil;

...

if (definition.IsOut)
{
    // There is an `out` modifier.
}
else if (definition.ParameterType.IsByReference)
{
    // There is a `ref` modifier.
}
else if (definition.CustomAttributes.Any(attribute => 
    attribute.AttributeType.FullName == typeof(ParamArrayAttribute).FullName))
{
    // There is a `params` modifier.
}
else
{
    // There are no modifiers.
}