它的工作原理如下:
>>> def foo(arg):
... x = 1
... print locals()
...
>>> foo(7)
{'arg': 7, 'x': 1}
>>> foo('bar')
{'arg': 'bar', 'x': 1}
我需要在c#.net中使用这样的东西,或者我自己如何实现呢?
答案 0 :(得分:2)
这是不可能的。其他答案给出了关于如何检索局部变量及其类型集的想法,但肯定不是它们在执行时的当前值。在C#或.NET中没有这方面的规定。方法参数也是如此:您可以检索它们的类型(甚至是它们的名称),但不能检索它们的值。
请允许我建议,如果您需要,您的代码设计存在严重缺陷。您应该考虑重新考虑代码结构。
作为一种变通方法,您可以声明一个类,它具有字段而不是您想要的本地。然后,您可以使用Reflection迭代这些字段:
foreach (var field in typeof(MyClass).GetFields())
Console.WriteLine("Field name: {0}; field value: {1}",
field.Name, field.GetValue(myInstance));
但是,我认为您可以很容易地发现这不是非常强大的代码:只要您对该类进行更改,您在此代码段中做出的隐式假设可能会中断。
在C#中传递关联数据的标准推荐方法是Dictionary<,>
。这相当于Python的dict
。如果需要将名称作为键和任意对象作为值,则可以使用Dictionary<string, object>
,但如果使用比object
更具体的类型,则可以从编译时有效性检查中受益。
答案 1 :(得分:1)
尝试围绕Reflection类,特别是LocalVariableInfo - 虽然不保留变量名,但它并不完全是你想要的。
答案 2 :(得分:1)
我认为这样的事情应该有效:
MethodBody currentMethodBody = MethodBase.GetCurrentMethod().GetMethodBody();
foreach(LocalVariableInfo local in currentMethodBody.LocalVariables)
{
Console.WriteLine("Local: {0}", local);
}
编辑:要获取调用方法的主体,因此可以在其自己的函数中使用,您可以使用StackFrame
类:
MethodBody callingBody = (new StackFrame(1)).GetMethod().GetMethodBody();
然而,这种方法很脆弱,因为StackFrame的使用取决于优化和方法内联等。