Pav*_*nin 6 c# reflection ref out parameterinfo
好吧,我对ParameterInfo班级的属性感到困惑.
不幸的是,文档不是很清楚:示例显示了如何构建方法,但没有显示这些方法在C#中的外观.
Cane有人告诉更多关于这些属性:
DefaultValueHasDefaultValueIsInIsLcidIsOptionalIsOutIsRetval哪种组合导致什么方法参考.
我做了一个简单的程序,它给出了以下输出:
方法名称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 =真
IsLcid =假
IsOptional =假
IsOut =假
IsRetVal =假
方法名称M6 void M6([Out] object param)
IL签名.method public hidebysig instance void M6([out] object param) cil managed
方法参数说明:
通过引用传递虚假
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
方法name M8 void M8([DefaultValue(null)] object param)
IL signature .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
方法参数说明:
参数名称参数
通过引用传递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 =假
我想In,Out和Optional属性与COM,因为他们位于System.Runtime.InteropServices namesapce.
但是文档再次很差.:(
什么是RetVal以及它在哪里使用?
这显示了其中的大部分,包括可选、输出和默认值标志。请注意,返回值可以表示为 a 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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1469 次 |
| 最近记录: |