C# ParameterInfo属性、属性和方法的out-ref参数
嗯,我被C# ParameterInfo属性、属性和方法的out-ref参数,c#,reflection,out,ref,parameterinfo,C#,Reflection,Out,Ref,Parameterinfo,嗯,我被ParameterInfo类的属性弄糊涂了。 不幸的是,文档不是很清楚:示例显示了如何构建方法,但没有显示这些方法在C#中的外观。 请告诉我更多关于这些属性的信息: DefaultValue hasdaultvalue IsIn IsLcid isonational IsOut IsRetval 哪种组合会导致什么方法参数。 我制作了一个简单的程序,它给出了以下输出: 方法名称M1void M1(对象参数) IL签名:.method public hidebysing实例void M
ParameterInfo
类的属性弄糊涂了。不幸的是,文档不是很清楚:示例显示了如何构建方法,但没有显示这些方法在C#中的外观。
请告诉我更多关于这些属性的信息:
DefaultValue
hasdaultvalue
IsIn
IsLcid
isonational
IsOut
IsRetval
我制作了一个简单的程序,它给出了以下输出: 方法名称M1
void M1(对象参数)
IL签名:
.method public hidebysing实例void M1(object param)cil managed
方法参数说明:
通过引用传递为False
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=False
IsRetVal=False
方法名称M2
void M2(对象参数=null)
IL签名
.method公共隐藏实例void M2([opt]object param)cil managed
方法参数说明:
通过引用传递为False
hasdaultvalue=True
DefaultValue=null
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False
方法名称M3
void M3(out对象参数)
IL签名
。方法公共隐藏实例void M3([out]对象和参数)cil管理
方法参数说明:
通过引用传递为True
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=True
IsRetVal=False
方法名称M4void M4(参考对象参数)
IL签名。方法公共隐藏实例void M4(对象和参数)cil管理
方法参数说明:
通过引用传递为True
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=False
IsRetVal=False
方法名称M5void M5([In]对象参数)
IL签名.method公共隐藏实例void M5([in]object param)cil托管
方法参数说明:
通过引用传递为False
HasDefaultValue=False
IsIn=True
IsLcid=False
等选项=假
IsOut=False
IsRetVal=False
方法名称M6void M6([Out]对象参数)
IL签名。方法公共隐藏实例void M6([out]对象参数)cil托管
方法参数说明:
通过引用传递为False
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=True
IsRetVal=False
方法名称M7void M7([Out]Out对象参数)
IL签名.method公共隐藏实例void M7([out]对象和参数)cil托管
方法参数说明:
通过引用传递为True
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=True
IsRetVal=False
方法名称M8void M8([DefaultValue(null)]对象参数)
IL签名.method公共隐藏实例void M8(对象参数)cil管理
方法参数说明:
通过引用传递为False
HasDefaultValue=False
IsIn=False
IsLcid=False
等选项=假
IsOut=False
IsRetVal=False
方法名称M9void M9([DefaultValue(-10)]int-param=10)
IL签名.method公共隐藏实例void M9([opt]int32 param)cil托管
方法参数说明:
参数名称param
通过引用传递为False
hasdaultvalue=True
DefaultValue=10
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False
方法名称M10void M10([可选]int参数)
IL签名.method公共隐藏实例void M10([opt]int32 param)cil托管
方法参数说明:
通过引用传递为False
HasDefaultValue=False
IsIn=False
IsLcid=False
IsOptional=True
IsOut=False
IsRetVal=False
我猜In
、Out
和可选
属性与COM相关,因为它们位于System.Runtime.InteropServices名称空间中。
但同样的,文档也很差(
什么是RetVal以及在哪里使用它?这显示了其中的大部分,包括可选、out和defaultvalue标志。请注意,返回值可以表示为ParameterInfo
,因为它与参数(包括属性)共享大多数共同点(通过[return:Foo]
语法)。有关retval和lcid,请参阅
另见:
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();
}
}