C# ParameterInfo属性、属性和方法的out-ref参数

C# ParameterInfo属性、属性和方法的out-ref参数,c#,reflection,out,ref,parameterinfo,C#,Reflection,Out,Ref,Parameterinfo,嗯,我被ParameterInfo类的属性弄糊涂了。 不幸的是,文档不是很清楚:示例显示了如何构建方法,但没有显示这些方法在C#中的外观。 请告诉我更多关于这些属性的信息: DefaultValue hasdaultvalue IsIn IsLcid isonational IsOut IsRetval 哪种组合会导致什么方法参数。 我制作了一个简单的程序,它给出了以下输出: 方法名称M1void M1(对象参数) IL签名:.method public hidebysing实例void M

嗯,我被
ParameterInfo
类的属性弄糊涂了。
不幸的是,文档不是很清楚:示例显示了如何构建方法,但没有显示这些方法在C#中的外观。

请告诉我更多关于这些属性的信息:

  • DefaultValue
  • hasdaultvalue
  • IsIn
  • IsLcid
  • isonational
  • IsOut
  • IsRetval
哪种组合会导致什么方法参数。
我制作了一个简单的程序,它给出了以下输出:

方法名称M1
void M1(对象参数)

IL签名:
.method public hidebysing实例void M1(object param)cil managed

方法参数说明:
通过引用传递为False
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=False
IsRetVal=False


方法名称M2
void M2(对象参数=null)

IL签名
.method公共隐藏实例void M2([opt]object param)cil managed

方法参数说明:
通过引用传递为False
hasdaultvalue=True
DefaultValue=null
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False


方法名称M3
void M3(out对象参数)

IL签名
。方法公共隐藏实例void M3([out]对象和参数)cil管理
方法参数说明:
通过引用传递为True
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=True
IsRetVal=False


方法名称M4
void M4(参考对象参数)

IL签名
。方法公共隐藏实例void M4(对象和参数)cil管理

方法参数说明:
通过引用传递为True
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=False
IsRetVal=False


方法名称M5
void M5([In]对象参数)

IL签名
.method公共隐藏实例void M5([in]object param)cil托管

方法参数说明:
通过引用传递为False
HasDefaultValue=False
IsIn=True
IsLcid=False
等选项=假
IsOut=False
IsRetVal=False


方法名称M6
void M6([Out]对象参数)

IL签名
。方法公共隐藏实例void M6([out]对象参数)cil托管
方法参数说明:
通过引用传递为False
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=True
IsRetVal=False


方法名称M7
void M7([Out]Out对象参数)

IL签名
.method公共隐藏实例void M7([out]对象和参数)cil托管
方法参数说明:
通过引用传递为True
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=True
IsRetVal=False


方法名称M8
void M8([DefaultValue(null)]对象参数)

IL签名
.method公共隐藏实例void M8(对象参数)cil管理

方法参数说明:
通过引用传递为False
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=False
IsRetVal=False


方法名称M9
void M9([DefaultValue(-10)]int-param=10)

IL签名
.method公共隐藏实例void M9([opt]int32 param)cil托管
方法参数说明:
参数名称param
通过引用传递为False
hasdaultvalue=True
DefaultValue=10
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False


方法名称M10
void M10([可选]int参数)

IL签名
.method公共隐藏实例void M10([opt]int32 param)cil托管

方法参数说明:
通过引用传递为False
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False

我猜
In
Out
可选
属性与COM相关,因为它们位于System.Runtime.InteropServices名称空间中。
但同样的,文档也很差(


什么是RetVal以及在哪里使用它?

这显示了其中的大部分,包括可选、out和defaultvalue标志。请注意,返回值可以表示为
ParameterInfo
,因为它与参数(包括属性)共享大多数共同点(通过
[return:Foo]
语法)。有关retval和lcid,请参阅

另见:
static class Program
{
    static void Main()
    {
        var method = typeof(Program).GetMethod("Test");

        Describe(method.ReturnParameter);
        foreach (var p in method.GetParameters()) Describe(p);
    }
    static void Describe(ParameterInfo param)
    {
        Console.WriteLine("{0}, {1}, {2}",
            string.IsNullOrEmpty(param.Name) ? "(no name)" : param.Name,
            param.ParameterType, param.Position);
        if (param.IsRetval) Console.WriteLine("retval");
        if (param.IsIn) Console.WriteLine("in");
        if (param.IsOut) Console.WriteLine("out");
        if (param.ParameterType.IsByRef) Console.WriteLine("by-ref");
        if (param.IsOptional) Console.WriteLine("optional");
        if (param.HasDefaultValue)
        {
            Console.WriteLine("default value: {0}", param.DefaultValue);
        }
        Console.WriteLine();
    }

    public static int Test(int j, ref int k, out int l, string foo = "abc")
    {
        throw new NotImplementedException();
    }
}