5

IDictionary<string, object>以前に呼び出されたメソッドの形式でパラメータのリストを取得できるようにしたいと思います。1つ問題があります。それは、無料の場合でも、サードパーティのアスペクト指向プログラミングフレームワークを利用できないことです。

例えば:

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace Question {
    internal class Program {
        public static void Main(string[] args) {
            var impl = new Implementation();
            impl.MethodA(1, "two", new OtherClass { Name = "John", Age = 100 });
        }
    }

    internal class Implementation {
        public void MethodA(int param1, string param2, OtherClass param3) {
            Logger.LogParameters();
        }
    }

    internal class OtherClass {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    internal class Logger {
        public static void LogParameters() {
            var parameters = GetParametersFromPreviousMethodCall();
            foreach (var keyValuePair in parameters)
                Console.WriteLine(keyValuePair.Key + "=" + keyValuePair.Value);
                // keyValuePair.Value may return a object that maybe required to
                // inspect to get a representation as a string.
        }

        private static IDictionary<string, object> GetParametersFromPreviousMethodCall() {
            throw new NotImplementedException("I need help here!");
        }
    }
}

何か提案やアイデアはありますか?必要に応じて、リフレクションを自由に使用してください。

4

2 に答える 2

2

AOPなしでできる最善のことは、StackFrameを使用して、呼び出されたメソッドを取得することだと思います。

これには、あまりにも多くのオーバーヘッドが必要になると思います。変更した変数を渡した場合はどうなりますか?メソッド内で変更される前の元の値を格納するためだけに、余分なスペースを割り当てる必要があります。それは本当にすぐに手に負えなくなる可能性があります

于 2012-04-09T19:30:28.633 に答える
2

StackTrace必要なものをすべて入手するために使用できます。

var trace = new System.Diagnostics.StackTrace();
var frame = trace.GetFrame(1); //previous
var method = frame.GetMethod();

これで、MethodBaseインスタンスができました。

名前は次の方法で取得できます。

var method = method.Name;

およびによるパラメータMethodBase.GetParameters

例えば:

var dict = new Dictionary<string, object>();
foreach (var param in method.GetParameters())
{
    dict.Add(param.Name, param.DefaultValue);
}
于 2012-04-09T19:39:04.263 に答える