Can I get parameter names/values procedurally from the currently executing function?

后端 未结 6 1382
猫巷女王i
猫巷女王i 2020-12-02 14:38

I would like to do something like this:

public MyFunction(int integerParameter, string stringParameter){
    //Do this:
    LogParameters();
    //Instead of         


        
6条回答
  •  猫巷女王i
    2020-12-02 14:57

    I realize people linked to other questions which mentioned PostSharp, but I couldn't help posting the code that solved my problem (using PostSharp) so other people could benefit from it.

    class Program {
        static void Main(string[] args) {
            Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
            new MyClass().MyMethod(44, "asdf qwer 1234", 3.14f, true);
            Console.ReadKey();
        }
    }
    public class MyClass {
        public MyClass() {
        }
        [Trace("Debug")]
        public int MyMethod(int x, string someString, float anotherFloat, bool theBool) {
            return x + 1;
        }
    }
    [Serializable]
    public sealed class TraceAttribute : OnMethodBoundaryAspect {
        private readonly string category;
    
        public TraceAttribute(string category) {
            this.category = category;
        }
    
        public string Category { get { return category; } }
    
        public override void OnEntry(MethodExecutionArgs args) {
            Trace.WriteLine(string.Format("Entering {0}.{1}.", 
                                          args.Method.DeclaringType.Name, 
                                          args.Method.Name), category);
    
            for (int x = 0; x < args.Arguments.Count; x++) {
                Trace.WriteLine(args.Method.GetParameters()[x].Name + " = " + 
                                args.Arguments.GetArgument(x));
            }
        }
    
        public override void OnExit(MethodExecutionArgs args) {
            Trace.WriteLine("Return Value: " + args.ReturnValue);
    
            Trace.WriteLine(string.Format("Leaving {0}.{1}.", 
                                          args.Method.DeclaringType.Name, 
                                          args.Method.Name), category);
        }
    } 
    

    Simply adding the Trace attribute to a method will cause very nice debugging information to be output, like so:

    Debug: Entering MyClass.MyMethod. 
    x = 44
    someString = asdf qwer 1234
    anotherFloat = 3.14
    theBool = True
    Return Value: 45
    Debug: Leaving MyClass.MyMethod.
    

提交回复
热议问题