C# 从不同范围运行方法

C# 从不同范围运行方法,c#,C#,我知道我需要帮助的不是父母,但这是我能想到的最接近描述这种情况的词 这不是我正在使用的实际代码 我有MainClass,它包含objectObjectA class MainClass { public int mode = 0; ObjectA obj = new ObjectA(); } 我需要从ObjectA对象访问模式变量。这可能吗?我觉得如果我至少可以从obj调用MainClass中的一个方法,我就可以全部设置好了。另外,我知道在这个意义上调用MainClass父类

我知道我需要帮助的不是父母,但这是我能想到的最接近描述这种情况的词

这不是我正在使用的实际代码

我有
MainClass
,它包含object
ObjectA

class MainClass
{
    public int mode = 0;
    ObjectA obj = new ObjectA();

}

我需要从
ObjectA
对象访问
模式
变量。这可能吗?我觉得如果我至少可以从
obj
调用
MainClass
中的一个方法,我就可以全部设置好了。另外,我知道在这个意义上调用
MainClass
父类是不正确的,在这个意义上,
MainClass
obj
的正确术语是什么。

你必须把事情联系起来,让孩子知道父类,这样才能起作用。大概是这样的:

class ParentClass
{
    public int mode = 0;

    public ChildClass child = null;

    public ParentClass()
    {
        child = new ChildClass(this);
    }
}

class ChildClass 
{
    public readonly ParentClass parent = null;

    public ChildClass (ParentClass parent)
    {
        this.parent = parent;
    }

    public int MethodThatReadsParentMode()
    {
        int mode = parent.mode;
        return mode;
    }
}

假设您能够更改
MainClass
,我可以想到两个选项:

  • 创建
    ObjectA
    实例时,添加对
    MainClass
    的引用
  • 就像你在评论中说的,使用事件
使用引用:

class MainClass
{
    public int mode = 31416;
    ObjectA obj;

    public MainClass() 
    {
        obj = new ObjectA(this);
    }

    public int GetMainClassMode() 
    {
        return mode;
    }

    public void Test() {
        Console.WriteLine("Calling test method inside obj");
        obj.Test();
    }
}

class ObjectA {

    MainClass parent = null;

    public ObjectA(MainClass parent) 
    {
        this.parent = parent;
    }

    public void Test() 
    {
        if (parent != null) 
        {
            Console.WriteLine("Getting mode from 'parent' MainClass");
            Console.WriteLine(string.Format("Mode = {0}", parent.GetMainClassMode()));
        }
    }       
}
class MainClass
{
    public int mode = 31416;
    ObjectA obj = new ObjectA();


    public MainClass() 
    {
        obj.ValueReturnEvent += HandleValueReturnEvent;
    }

    public int GetMainClassMode() 
    {
        return mode;
    }

    // Handle event, return data
    private int HandleValueReturnEvent(object sender, EventArgs e)
    {
        return mode;
    }

    public void Test() {
        Console.WriteLine("Calling test method inside obj");
        obj.Test();
    }
}

class ObjectA {

    // delegate
    public delegate int ReturnValueEventHandler(object sender, EventArgs args);
    // event
    public event ReturnValueEventHandler ValueReturnEvent;


    public void Test() 
    {
        // make sure at least one subscriber
        if (ValueReturnEvent != null)  
        {
            // note the event is returning a value
            var myValue = ValueReturnEvent(this, null);

            Console.WriteLine("Getting mode from 'parent' MainClass");
            Console.WriteLine(string.Format("Mode = {0}", myValue));
        }
    }   
}

使用事件:

class MainClass
{
    public int mode = 31416;
    ObjectA obj;

    public MainClass() 
    {
        obj = new ObjectA(this);
    }

    public int GetMainClassMode() 
    {
        return mode;
    }

    public void Test() {
        Console.WriteLine("Calling test method inside obj");
        obj.Test();
    }
}

class ObjectA {

    MainClass parent = null;

    public ObjectA(MainClass parent) 
    {
        this.parent = parent;
    }

    public void Test() 
    {
        if (parent != null) 
        {
            Console.WriteLine("Getting mode from 'parent' MainClass");
            Console.WriteLine(string.Format("Mode = {0}", parent.GetMainClassMode()));
        }
    }       
}
class MainClass
{
    public int mode = 31416;
    ObjectA obj = new ObjectA();


    public MainClass() 
    {
        obj.ValueReturnEvent += HandleValueReturnEvent;
    }

    public int GetMainClassMode() 
    {
        return mode;
    }

    // Handle event, return data
    private int HandleValueReturnEvent(object sender, EventArgs e)
    {
        return mode;
    }

    public void Test() {
        Console.WriteLine("Calling test method inside obj");
        obj.Test();
    }
}

class ObjectA {

    // delegate
    public delegate int ReturnValueEventHandler(object sender, EventArgs args);
    // event
    public event ReturnValueEventHandler ValueReturnEvent;


    public void Test() 
    {
        // make sure at least one subscriber
        if (ValueReturnEvent != null)  
        {
            // note the event is returning a value
            var myValue = ValueReturnEvent(this, null);

            Console.WriteLine("Getting mode from 'parent' MainClass");
            Console.WriteLine(string.Format("Mode = {0}", myValue));
        }
    }   
}

在这两种情况下,您都会得到以下输出:

Calling test method inside obj
Getting mode from 'parent' MainClass
Mode = 31416

您将字段
mode
public,因此我假设使用class
MainClass
do的人可能会更改此字段

让我们假设程序看起来像这样

class Program {
  var main = new MainClass();
  main.mode = 1;
}
您的
obj
字段是私有的,因此
Program
无法访问它。 因此,当有人更改了字段
模式
对象A
应该得到字段
模式
的新值。 可能的解决办法:

class ObjectA {
  public int Mode { get; set; }
}

class MainClass {
  private obj = new ObjectA();
  public int Mode {
    get { return this.obj.Mode; }
    set { this.obj.Mode = value; }
  }
}
在案例字段
模式
属于
maincals
中还有另一个选项

class ObjectA {
  private int mode;
  public ObjectA(int mode) {
    this.mode = mode;
  }
  // you can create property instead of method
  // I'm not sure how you use this variable, so I just added set method
  public void SetMode(int mode) {
    this.mode = mode;
  }
}

class MainClass {
  private int mode = 0;
  private obj = new ObjectA();
  public int Mode {
    get { return this.mode; }
    set {
      this.obj.SetMode(value);
      this.mode = value; 
    }
  }
}

即使你已经得到了答案,你也可以简单地将它注入你的
对象a
。。。有一个接受int的构造函数,当您创建对象时,将
模式
传入并保存到该对象中

我发现对象从其作用域中使用它所需要的任何东西,而不是访问父对象来请求变量,这一点更清楚。

我不是说可能不需要它,这只是另一种想法。

如果可以,我也会搜索这个,但我不知道搜索所需的术语,所以感谢您的帮助!我假设您可以更改
ObjectA
?您正在寻找的编程概念称为“范围”。我建议先回顾一下这个概念,然后关注C#中的变量和方法范围。谢谢这个术语。我被允许更改ObjectA。我要看看是否可以使用事件或其他系统,因为我需要在非常特定的时间运行一个方法。如果不是的话,我会另找一条路。谢谢谢谢你,我认为这是可能的事件,但不知道如何实施。非常感谢@iglooJuan很棒的代码,但是看起来有点过度设计了。)@VadimSentyaev可能是,但是非常有教育意义。对于偶然发现它的任何其他人,他们可以将其用于其他目的:)