在python中需要像locals这样的东西

时间:2010-08-17 15:26:06

标签: c# .net

它的工作原理如下:

>>> def foo(arg): 

...     x = 1
...     print locals()
...     
>>> foo(7)        
{'arg': 7, 'x': 1}
>>> foo('bar')    
{'arg': 'bar', 'x': 1}

我需要在c#.net中使用这样的东西,或者我自己如何实现呢?

3 个答案:

答案 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的使用取决于优化和方法内联等。