6

さて、私はParameterInfoクラスのプロパティに混乱しています。
残念ながら、ドキュメントはあまり明確ではありません。例ではメソッドの作成方法を示していますが、C#でのこれらのメソッドの外観は示していません。

誰かがこれらのプロパティについてもっと話すことができます:

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

そして、どの組み合わせがどのメソッドパラメータにつながるか。
次の出力を提供する簡単なプログラムを作成しました。

メソッド名 void M1(object param)
M1IL 署名:.method public hidebysig instance void M1(object param) cil managed
メソッドパラメーターの説明:
参照によって渡されますFalse
HasDefaultValue = False
IsIn = False
IsLcid = False
IsOptional = False
IsOut = False
IsRetVal =False


メソッド名 void M2(object param = null)
M2IL 署名.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


メソッド名 void M3(out object param)
M3IL 署名.method public hidebysig instance void M3([out] object& param) cil managed
メソッドパラメーターの説明:参照によって
渡されるTrue
HasDefaultValue = False
IsIn = False
IsLcid = False
IsOptional = False
IsOut = True
IsRetVal =False


メソッド名 void M4(ref object param)
M4IL シグネチャ.method public hidebysig instance void M4(object& param) cil managed
メソッドパラメータの説明:参照によって
渡されますTrue
HasDefaultValue = False
IsIn = False
IsLcid = False
IsOptional = False
IsOut = False
IsRetVal=False


メソッド名 void M5([In] object param)
M5IL シグネチャ.method public hidebysig instance void M5([in] object param) cil managed
メソッドパラメーターの説明:
参照によって渡されますFalse
HasDefaultValue = False
IsIn = True
IsLcid = False
IsOptional = False
IsOut = False
IsRetVal =False


メソッド名 void M6([Out] object param)
M6IL シグネチャ.method public hidebysig instance void M6([out] object param) cil managed
メソッドパラメーターの説明:
参照によって渡される
FalseHasDefaultValue= False
IsIn = False
IsLcid = False
IsOptional = False
IsOut = True
IsRetVal =False


メソッド名 void M7([Out] out object param)
M7IL シグネチャ.method public hidebysig instance void M7([out] object& param) cil managed
メソッドパラメーターの説明:参照によって
渡されるTrue
HasDefaultValue = False
IsIn = False
IsLcid = False
IsOptional = False
IsOut = True
IsRetVal =False


メソッド名 void M8([DefaultValue(null)] object param)
M8IL シグネチャ.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


メソッド名 void M10([Optional] int param)
M10IL シグネチャ.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が、属性はSystem.Runtime.InteropServicesのnamesapceにあるため、COMに関連しています。 しかし、やはりドキュメントはかなり貧弱です。:(OutOptional

そして、RetValとは何ですか?それはどこで使用されますか?

4

1 に答える 1

2

これは、オプション、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();
    }
}
于 2013-03-26T12:35:51.890 に答える