从 .NET 5.0 / C# 9.0 中的子实例访问父实例数据
Accessing parent instance data from child instances in .NET 5.0 / C# 9.0
我有一个 .NET 5.0 Web 应用程序,它为每个端点实例化 类。那些 类 实例化子 类。除了我现在这样做的方式之外,还有更优雅或更有效的方式来从子实例访问父实例数据吗?
举个例子:
public class ComponentClass
{
private PageClass _page;
public ComponentClass(PageClass page)
{
_page = page;
}
public void ComponentMethod()
{
// Call the method from the parent instance
page.PageMethod();
}
}
public class PageClass
{
private ComponentClass _component;
public PageClass()
{
_component = new ComponentClass(this);
}
public async Task ProcessRequest(HttpContext context)
{
// Call the component's method
_component.ComponentMethod();
}
public void PageMethod()
{
// Do something here
}
}
具体来说,我试图避免必须将 this
传递给每个 ComponentClass 实例...
如果您想调用 parent 上的方法,那么您有两种选择。第一个是将 parent 的引用传递给 child。没有办法解决这个问题,object 无法知道它是从哪个 object 引用的。事实上,它可以被多个 parent object 引用。
更好的解决方案是使用事件。这样 child 就永远不会知道 parent(s) 的任何信息,并且可以发出任何数量的组件都可以订阅的事件。有关事件的更多详细信息,请参阅 here。例如,您的组件可能如下所示:
public class Component
{
public event EventHandler Tick;
public void DoSomething()
{
EventHandler handler = Tick;
handler?.Invoke(this, new EventArgs());
}
}
以及您的 PageClass:
public class PageClass
{
public Component _component { get; set; }
public void Init()
{
_component = new Component();
_component.Tick += Component_Tick;
}
public void MakeComponentTick()
{
// This method is just for testing, it's likely this would be triggered by user input
_component.DoSomething();
}
private void Component_Tick(object sender, EventArgs e)
{
Console.WriteLine("Component ticked!");
}
}
我有一个 .NET 5.0 Web 应用程序,它为每个端点实例化 类。那些 类 实例化子 类。除了我现在这样做的方式之外,还有更优雅或更有效的方式来从子实例访问父实例数据吗?
举个例子:
public class ComponentClass
{
private PageClass _page;
public ComponentClass(PageClass page)
{
_page = page;
}
public void ComponentMethod()
{
// Call the method from the parent instance
page.PageMethod();
}
}
public class PageClass
{
private ComponentClass _component;
public PageClass()
{
_component = new ComponentClass(this);
}
public async Task ProcessRequest(HttpContext context)
{
// Call the component's method
_component.ComponentMethod();
}
public void PageMethod()
{
// Do something here
}
}
具体来说,我试图避免必须将 this
传递给每个 ComponentClass 实例...
如果您想调用 parent 上的方法,那么您有两种选择。第一个是将 parent 的引用传递给 child。没有办法解决这个问题,object 无法知道它是从哪个 object 引用的。事实上,它可以被多个 parent object 引用。
更好的解决方案是使用事件。这样 child 就永远不会知道 parent(s) 的任何信息,并且可以发出任何数量的组件都可以订阅的事件。有关事件的更多详细信息,请参阅 here。例如,您的组件可能如下所示:
public class Component
{
public event EventHandler Tick;
public void DoSomething()
{
EventHandler handler = Tick;
handler?.Invoke(this, new EventArgs());
}
}
以及您的 PageClass:
public class PageClass
{
public Component _component { get; set; }
public void Init()
{
_component = new Component();
_component.Tick += Component_Tick;
}
public void MakeComponentTick()
{
// This method is just for testing, it's likely this would be triggered by user input
_component.DoSomething();
}
private void Component_Tick(object sender, EventArgs e)
{
Console.WriteLine("Component ticked!");
}
}