简体   繁体   English

方法的ParameterInfo属性,属性和out ref参数

[英]ParameterInfo properties, attributes and out ref parameters of the methods

Well, I'm confused by the properties of the ParameterInfo class. 好吧,我对ParameterInfo类的属性感到困惑。
Unfortunately documentation is not very clear: examples show how to build methods but don't show how these methods look in C#. 不幸的是,文档不是很清楚:示例显示了如何构建方法,但没有显示这些方法在C#中的外观。

Cane somebody tell more about these properties: 有人可以告诉更多有关这些属性的信息:

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

And which combination leads to what method params. 以及哪种组合导致什么方法参数。
I made a simple program which gives the following output: 我编写了一个简单的程序,给出了以下输出:

Method name M1 void M1(object param) 方法名称M1 void M1(object param)
IL signature: .method public hidebysig instance void M1(object param) cil managed IL签名: .method public hidebysig instance void M1(object param) cil managed
Method parameter description: 方法参数说明:
Is passed by reference False 通过引用传递False
HasDefaultValue=False HasDefaultValue = False
IsIn=False IsIn =假
IsLcid=False IsLcid =假
IsOptional=False IsOptional =假
IsOut=False IsOut =假
IsRetVal=False IsRetVal =假


Method name M2 void M2(object param = null) 方法名称M2 void M2(object param = null)
IL signature .method public hidebysig instance void M2([opt] object param) cil managed IL签名.method public hidebysig instance void M2([opt] object param) cil managed
Method parameter description: 方法参数说明:
Is passed by reference False 通过引用传递False
HasDefaultValue=True HasDefaultValue =真
DefaultValue=null DefaultValue =空
IsIn=False IsIn =假
IsLcid=False IsLcid =假
IsOptional=True IsOptional =真
IsOut=False IsOut =假
IsRetVal=False IsRetVal =假


Method name M3 void M3(out object param) 方法名称M3 void M3(out object param)
IL signature .method public hidebysig instance void M3([out] object& param) cil managed IL签名.method public hidebysig instance void M3([out] object& param) cil managed
Method parameter description: 方法参数说明:
Is passed by reference True 通过引用传递True
HasDefaultValue=False HasDefaultValue = False
IsIn=False IsIn =假
IsLcid=False IsLcid =假
IsOptional=False IsOptional =假
IsOut=True IsOut =真
IsRetVal=False IsRetVal =假


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


Method name M5 void M5([In] object param) 方法名称M5 void M5([In] object param)
IL signature .method public hidebysig instance void M5([in] object param) cil managed IL签名.method public hidebysig instance void M5([in] object param) cil managed
Method parameter description: 方法参数说明:
Is passed by reference False 通过引用传递False
HasDefaultValue=False HasDefaultValue = False
IsIn=True IsIn =真
IsLcid=False IsLcid =假
IsOptional=False IsOptional =假
IsOut=False IsOut =假
IsRetVal=False IsRetVal =假


Method name M6 void M6([Out] object param) 方法名称M6 void M6([Out] object param)
IL signature .method public hidebysig instance void M6([out] object param) cil managed IL签名.method public hidebysig instance void M6([out] object param) cil managed
Method parameter description: 方法参数说明:
Is passed by reference False 通过引用传递False
HasDefaultValue=False HasDefaultValue = False
IsIn=False IsIn =假
IsLcid=False IsLcid =假
IsOptional=False IsOptional =假
IsOut=True IsOut =真
IsRetVal=False IsRetVal =假


Method name M7 void M7([Out] out object param) 方法名称M7 void M7([Out] out object param)
IL signature .method public hidebysig instance void M7([out] object& param) cil managed IL签名.method public hidebysig instance void M7([out] object& param) cil managed
Method parameter description: 方法参数说明:
Is passed by reference True 通过引用传递True
HasDefaultValue=False HasDefaultValue = False
IsIn=False IsIn =假
IsLcid=False IsLcid =假
IsOptional=False IsOptional =假
IsOut=True IsOut =真
IsRetVal=False IsRetVal =假


Method name M8 void M8([DefaultValue(null)] object param) 方法名称M8 void M8([DefaultValue(null)] object param)
IL signature .method public hidebysig instance void M8(object param) cil managed IL签名.method public hidebysig instance void M8(object param) cil managed
Method parameter description: 方法参数说明:
Is passed by reference False 通过引用传递False
HasDefaultValue=False HasDefaultValue = False
IsIn=False IsIn =假
IsLcid=False IsLcid =假
IsOptional=False IsOptional =假
IsOut=False IsOut =假
IsRetVal=False IsRetVal =假


Method name M9 void M9([DefaultValue(-10)] int param = 10) 方法名称M9 void M9([DefaultValue(-10)] int param = 10)
IL signature .method public hidebysig instance void M9([opt] int32 param) cil managed IL签名.method public hidebysig instance void M9([opt] int32 param) cil managed
Method parameter description: 方法参数说明:
Parameter name param 参数名称参数
Is passed by reference False 通过引用传递False
HasDefaultValue=True HasDefaultValue =真
DefaultValue=10 默认值= 10
IsIn=False IsIn =假
IsLcid=False IsLcid =假
IsOptional=True IsOptional =真
IsOut=False IsOut =假
IsRetVal=False IsRetVal =假


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

I guess In , Out and Optional attributes relate to COM as they are located in System.Runtime.InteropServices namesapce. 我猜InOutOptional属性与COM有关,因为它们位于System.Runtime.InteropServices名称空间中。
But again documentation is quite poor. 但是文档也很差。 :( :(

And what is RetVal and where it is used? RetVal是什么?在哪里使用?

This shows most of them, including the optional, out and defaultvalue flags. 这显示了它们中的大多数,包括可选,out和defaultvalue标志。 Note that the return value can be represented as a ParameterInfo because it shares most things in common with parameters, including attributes (via the [return: Foo] syntax). 注意,返回值可以表示为ParameterInfo因为它与参数(包括属性)(通过[return: Foo]语法)共享大多数相同的东西。 For retval and lcid, see When are ParameterInfo.IsLcid or ParameterInfo.IsRetval true? 有关retval和lcid,请参阅何时ParameterInfo.IsLcid或ParameterInfo.IsRetval为true?

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();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM