代码之家  ›  专栏  ›  技术社区  ›  Overdose

需要像python里的本地人一样的东西吗

  •  1
  • Overdose  · 技术社区  · 15 年前

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

    3 回复  |  直到 15 年前
        1
  •  2
  •   Timwi    15 年前

    这是不可能的。其他的答案给了你一些关于如何检索局部变量集及其类型的想法,但肯定不是它们在执行时的当前值。C#或.NET中对此没有规定。方法参数也是如此:可以检索它们的类型(甚至名称),但不能检索它们的值。

    请允许我建议,如果你需要这个,你的代码设计是严重缺陷。你应该考虑重新考虑你的代码结构。

    作为解决方法,您可以声明 哪个有 领域

    foreach (var field in typeof(MyClass).GetFields())
        Console.WriteLine("Field name: {0}; field value: {1}",
            field.Name, field.GetValue(myInstance));
    

    但是,我认为您可以很容易地看到,这不是非常健壮的代码:每当您对该类进行更改时,在此代码段中所做的隐式假设都可能会被打破。

    Dictionary<,> . 这相当于蟒蛇 dict Dictionary<string, object> object .

        2
  •  1
  •   Justin Ethier    15 年前

    尤其是在反射类中,尝试一下 LocalVariableInfo -虽然变量名没有被保留,所以它并不是您想要的。

        3
  •  1
  •   Lee    15 年前

    MethodBody currentMethodBody = MethodBase.GetCurrentMethod().GetMethodBody();
    foreach(LocalVariableInfo local in currentMethodBody.LocalVariables)
    {
        Console.WriteLine("Local: {0}", local);
    }
    

    EDIT:要获取调用方法的主体,因此可以在它自己的函数中使用 StackFrame

    MethodBody callingBody = (new StackFrame(1)).GetMethod().GetMethodBody();
    

    然而,这种方法是脆弱的,因为StackFrame的使用依赖于优化和方法内联之类的东西。

    推荐文章