0

次のように3つのメソッドがある場合など、C#を使用してパラメーターの数が異なる場合でも、メソッドのパラメーターの値を取得したい:

public void method1 (string param1)
{
    List<string> parametervalues = getParameters(this.Method);
}
public void method2 (int param1, string param2)
{
    List<string> parametervalues = getParameters(this.Method);
}
public void method3 (string param1, int param2, bool param3)
{
    List<string> parametervalues = getParameters(this.Method);
}

したがって、getParameters メソッドでは、メソッド名を受け取り、パラメーターの数に関係なく、パラメーターの値を文字列のリストとして返します。

パラメータの数を取得できるようになりましたが、次のように値はありません

var method = MethodInfo.GetCurrentMethod();
var parameters = method.GetParameters();
List<string> parameterList = new List<string>();
if (parameters.Length > 0)
{
    foreach (var p in parameters)
    {
        parameterList.Add(p.Name);
    }
}

アップデート:

次のように (params object[] values) をメソッドパラメーターとして使用する別の方法を見つけました

method1(string a, string b, string c)
{
list<string> = getParameterasList(a,b,c);
}

getParameterasList(params object[] values)
{
            List<string> parameterList = new List<string>();
            if (values.Length > 0)
            {
                foreach (var v in values)
                {
                    parameterList.Add(v.ToString());
                }
            }
return parameterList;
}
4

1 に答える 1

0

これは、インターセプトを使用して実現できます。警告: これを確認し、理解し、正しく実装するには時間がかかります。インターセプト呼び出しの基本を理解し、それを実装できるようになると、メソッド パラメーターの値を取得できるようになります。

簡単に言えば、インターセプトとは、メソッドの呼び出しをインターセプトし、呼び出しの前に実行したいことを実行し、呼び出しを実際に実行させてから、メソッドに戻る途中で呼び出しで何かを実行する機会を得るプロセスです。発信者。

ここで完全な例を示すのは難しいですが、そのリンクをたどれば問題ありません。インターセプト中に、メソッドから例外が返されたときにメソッド パラメーターの値を取得する方法は次のとおりです。(必要な情報が含まれている にアクセスできますIMethodCallMessage。) これを行うのは、メソッドのパラメーターをログに記録できるようにするためです。

    private static List<ParameterInformation> GetParameterInfoList(IMethodCallMessage methodCallMessage)
    {
        var = new List<ParameterInformation>();

        // Note: This works even if a parameter's value is null.
        for(int i = 0 ; i < methodCallMessage.ArgCount ; i++)
        {
            parameterInformationList.Add(new ParameterInformation(methodCallMessage.GetArgName(i), methodCallMessage.Args[i]));
        }

        return parameterInformationList;
    }
于 2013-08-03T12:50:33.300 に答える