Свойства ParameterInfo, атрибуты и параметры ссылок на методы

Ну, меня смущают свойства ParameterInfo учебный класс.
К сожалению, документация не очень понятна: примеры показывают, как создавать методы, но не показывают, как эти методы выглядят в C#.

Кто-нибудь может рассказать об этих свойствах:

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

И какая комбинация приводит к тому, что метод params.
Я сделал простую программу, которая дает следующий вывод:

Имя метода 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


Имя метода М2 void M2(object param = null)
Подпись IL .method public hidebysig instance void M2([opt] object param) cil managed
Описание параметров метода:
Передано по ссылке False
HasDefaultValue = True
DefaultValue = нуль
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

Похоже In, Out а также Optional атрибуты относятся к COM, так как они находятся в именах System.Runtime.InteropServices.
Но опять же документация довольно скудная.:(

А что такое RetVal и где он используется?

1 ответ

Решение

Это показывает большинство из них, включая необязательные флаги 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();
    }
}
Другие вопросы по тегам