[英]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 =假
我猜In
, Out
和Optional
屬性與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.