簡體   English   中英

方法的ParameterInfo屬性,屬性和out ref參數

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

好吧,我對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 =假
IsLcid =假
IsOptional =假
IsOut =假
IsRetVal =假


方法名稱M2 void M2(object param = null)
IL簽名.method public hidebysig instance void M2([opt] object param) cil managed
方法參數說明:
通過引用傳遞False
HasDefaultValue =真
DefaultValue =空
IsIn =假
IsLcid =假
IsOptional =真
IsOut =假
IsRetVal =假


方法名稱M3 void M3(out object param)
IL簽名.method public hidebysig instance void M3([out] object& param) cil managed
方法參數說明:
通過引用傳遞True
HasDefaultValue = False
IsIn =假
IsLcid =假
IsOptional =假
IsOut =真
IsRetVal =假


方法名稱M4 void M4(ref object param)
IL簽名.method public hidebysig instance void M4(object& param) cil managed
方法參數說明:
通過引用傳遞True
HasDefaultValue = False
IsIn =假
IsLcid =假
IsOptional =假
IsOut =假
IsRetVal =假


方法名稱M5 void M5([In] object param)
IL簽名.method public hidebysig instance void M5([in] object param) cil managed
方法參數說明:
通過引用傳遞False
HasDefaultValue = False
IsIn =真
IsLcid =假
IsOptional =假
IsOut =假
IsRetVal =假


方法名稱M6 void M6([Out] object param)
IL簽名.method public hidebysig instance void M6([out] object param) cil managed
方法參數說明:
通過引用傳遞False
HasDefaultValue = False
IsIn =假
IsLcid =假
IsOptional =假
IsOut =真
IsRetVal =假


方法名稱M7 void M7([Out] out object param)
IL簽名.method public hidebysig instance void M7([out] object& param) cil managed
方法參數說明:
通過引用傳遞True
HasDefaultValue = False
IsIn =假
IsLcid =假
IsOptional =假
IsOut =真
IsRetVal =假


方法名稱M8 void M8([DefaultValue(null)] object param)
IL簽名.method public hidebysig instance void M8(object param) cil managed
方法參數說明:
通過引用傳遞False
HasDefaultValue = False
IsIn =假
IsLcid =假
IsOptional =假
IsOut =假
IsRetVal =假


方法名稱M9 void M9([DefaultValue(-10)] int param = 10)
IL簽名.method public hidebysig instance void M9([opt] int32 param) cil managed
方法參數說明:
參數名稱參數
通過引用傳遞False
HasDefaultValue =真
默認值= 10
IsIn =假
IsLcid =假
IsOptional =真
IsOut =假
IsRetVal =假


方法名稱M10 void M10([Optional] int param)
IL簽名.method public hidebysig instance void M10([opt] int32 param) cil managed
方法參數說明:
通過引用傳遞False
HasDefaultValue = False
IsIn =假
IsLcid =假
IsOptional =真
IsOut =假
IsRetVal =假

我猜InOutOptional屬性與COM有關,因為它們位於System.Runtime.InteropServices名稱空間中。
但是文檔也很差。 :(

RetVal是什么?在哪里使用?

這顯示了它們中的大多數,包括可選,out和defaultvalue標志。 注意,返回值可以表示為ParameterInfo因為它與參數(包括屬性)(通過[return: Foo]語法)共享大多數相同的東西。 有關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