C# 在运行时获取本地字段的值

C# 在运行时获取本地字段的值,c#,reflection,local,.net-assembly,C#,Reflection,Local,.net Assembly,我对c真的很陌生,我只想知道是否有可能在运行时获取本地声明字段的值?例如,假设下面示例中的ClassToTest不能更改 例如: public class ClassToTest { public void func() { int number = 25; } } Public class MyProgram { public static void Main() { ClassToTest instance = new ClassToTest(); in

我对c真的很陌生,我只想知道是否有可能在运行时获取本地声明字段的值?例如,假设下面示例中的ClassToTest不能更改

例如:

public class ClassToTest {
  public void func() {
    int number = 25;
  }
}

Public class MyProgram {
  public static void Main() {
    ClassToTest instance = new ClassToTest();
    instance.func();
    // Can field "number" value be extracted here?
  }
}

我一直在寻找反射和其他与组装相关的东西,但仍然没有运气。任何建议都将不胜感激。

这不是函数的工作方式

public class ClassToTest {
  public int func() {
    return 25;
  }
}

Public class MyProgram {
  public static void Main() {
    ClassToTest instance = new ClassToTest();
    int number = instance.func();
  }
}

返回值的函数应具有返回类型,即int,以及返回类型,即return 25;,然后当int number=instance.func;当运行时,func方法将返回25并将其存储为int number,这是不可能的,因为无法从外部范围访问正文中声明的内容。意味着您的变量仅在func方法中可用。您可以做的是返回所需的值或声明属性

public int Func()
{
  return 25;
}

public class MyProgram {
  public static void Main() {
    ClassToTest instance = new ClassToTest();
    int number = instance.func();
    //number will be 25
  }
}
对于一个属性,它可以像这样工作:

public class ClassToTest {

  public int Number{get{return 25;};private set;}
}

Public class MyProgram {
  public static void Main() {
    ClassToTest instance = new ClassToTest();
    int number = instance.Number;
  }
}
使用方法或属性是您的决定。但你可以这样想:

我的对象由什么组成?我的对象可以做什么


例如,汽车有轮子。所以用一个属性来表示一个轮子。但是汽车可以移动,所以将移动作为方法来实现。

您无法访问超出当前范围的变量,无论是另一种方法,甚至只是另一种开关情况。但是,没有理由这样做,您可以通过在方法中设置属性来执行相同的操作:

public class ClassToTest {
    public int Number { get; private set; }
    public void func() {
        this.Number = 25;
    }
}

Public class MyProgram {
    public static void Main() {
        ClassToTest instance = new ClassToTest();
        instance.func();
        var i = instance.Number;
    }
}
我还为属性使用了一个公共getter和一个私有setter,这样就可以从类内部而不是外部更改数值


其他人指出的另一种方法就是从func返回值

不,这是不可能的,也没有理由这样做。编号的作用域是方法而不是类。您还应该从可以编译的发布代码开始。自己测试一下,看看是否可以让它运行。如果你想要这个值,那么就从方法返回它,或者创建一个类/实例范围的属性并设置它的值。原来我正在做的程序比这个要复杂得多。而且我不能重构ClassToTest,它非常简单。该方法设置值,但一旦它超出范围,即该方法完成变量的运行,其值就会从堆栈中弹出。没有办法得到那个值。也不要试图获取值,这只是非常糟糕的编程实践。你会破坏封装。如果您对该值感兴趣,请找到一种方法,在知道该值的实例上设置该值,或返回该值,或编写一个新方法重新计算该值。我在考虑可能在单独的线程上运行该方法。然后,执行Thread.sleep或类似操作以阻止其关闭。然后,使用反射来获取值?这将不起作用,因为您仍然无法访问该变量,即使它起作用,也纯粹是过火了。原来我正在做的程序比这个要复杂得多。而且我也不能重构ClassToTest。@AngeloCharl您必须更改该类才能从func中获得值,或者重新思考您的完整方法。您无法访问变量,因为在您的案例中,当离开范围时,方法变量不再存在。