6

好吧,我对ParameterInfo类的属性感到困惑。
不幸的是,文档不是很清楚:示例展示了如何构建方法,但没有展示这些方法在 C# 中的外观。

甘蔗有人告诉更多关于这些属性:

  • DefaultValue
  • HasDefaultValue
  • IsIn
  • IsLcid
  • IsOptional
  • IsOut
  • IsRetval

哪个组合导致什么方法参数。
我做了一个简单的程序,它给出以下输出:

方法名 M1 void M1(object param)
IL 签名:.method public hidebysig instance void M1(object param) cil managed
方法参数描述:
引用传递 False
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut=False
IsRetVal=False


方法名 M2 void M2(object param = null)
IL 签名.method public hidebysig instance void M2([opt] object param) cil managed
方法参数描述:
引用传递 False
HasDefaultValue=True
DefaultValue=null
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False


方法名称 M3 void M3(out object param)
IL 签名.method public hidebysig instance void M3([out] object& param) cil managed
方法参数描述:
通过引用传递 True
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut=True
IsRetVal=False


方法名称 M4 void M4(ref object param)
IL 签名.method public hidebysig instance void M4(object& param) cil managed
方法参数说明:
通过引用传递 True
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut=False
IsRetVal=False


方法名称 M5 void M5([In] object param)
IL 签名.method public hidebysig instance void M5([in] object param) cil managed
方法参数说明:
通过引用传递 False
HasDefaultValue=False
IsIn=True
IsLcid=False
IsOptional=False
IsOut=False
IsRetVal=False


方法名称 M6 void M6([Out] object param)
IL 签名.method public hidebysig instance void M6([out] object param) cil managed
方法参数说明:
通过引用传递 False
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut=True
IsRetVal=False


方法名称 M7 void M7([Out] out object param)
IL 签名.method public hidebysig instance void M7([out] object& param) cil managed
方法参数描述:
通过引用传递 True
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut =True
IsRetVal=False


方法名 M8 void M8([DefaultValue(null)] object param)
IL 签名.method public hidebysig instance void M8(object param) cil managed
方法参数说明:
通过引用传递 False
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=False
IsOut=False
IsRetVal=False


方法名 M9 void M9([DefaultValue(-10)] int param = 10)
IL 签名.method public hidebysig instance void M9([opt] int32 param) cil managed
方法参数说明:
参数名称 param
通过引用传递 False
HasDefaultValue=True
DefaultValue=10
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False


方法名称 M10 void M10([Optional] int param)
IL 签名.method public hidebysig instance void M10([opt] int32 param) cil managed
方法参数说明:
通过引用传递 False
HasDefaultValue =False
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False

我猜InOut并且Optional属性与 COM 相关,因为它们位于 System.Runtime.InteropServices 命名空间中。
但是文档又很差。:(

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

4

1 回答 1

2

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

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();
    }
}
于 2013-03-26T12:35:51.890 回答