本文介绍了我能得到的参数名称/值在程序上,从当前执行的功能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我愿做这样的事情:
public MyFunction(int integerParameter, string stringParameter){
//Do this:
LogParameters();
//Instead of this:
//Log.Debug("integerParameter: " + integerParameter +
// ", stringParameter: " + stringParameter);
}
public LogParameters(){
//Look up 1 level in the call stack (if possible),
//Programmatically loop through the function's parameters/values
//and log them to a file (with the function name as well).
//If I can pass a MethodInfo instead of analyzing the call stack, great.
}
我甚至不知道我想做的事是可能的,但它会很高兴能够自动输出参数的名称/值在运行时文件中没有明确写在code,以记录它们。
I'm not even sure what I want to do is possible, but it would be very nice to be able to automatically output parameter names/values at runtime to a file without explicitly writing the code to log them.
这可能吗?
推荐答案
我认识的人联系到里面提到PostSharp其他问题,但我还是忍不住张贴code,它解决了我的问题(使用PostSharp),以便其他人们可以从中受益。
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.
这篇关于我能得到的参数名称/值在程序上,从当前执行的功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!