Свойства 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();
}
}