gpt4 book ai didi

c# - 使用对象初始化时,如何获取父类的实例,即发起当前类的类?

转载 作者:行者123 更新时间:2023-11-30 16:40:09 26 4
gpt4 key购买 nike

我经常遇到这种情况。我终于在寻找关于如何做到这一点的答案。我知道有很多方法,但大多数都是肮脏的并且包含不良做法。

澄清一下,这不是征求您的意见,而是询问大多数程序员如何处理此类问题,几乎所有可能的方式都不包括真正糟糕的代码。

我有一个名为 CoreContext 的类,我将新实例注入(inject)属性的类名中,如下所示。但是当我需要启动该类的父类时会发生什么?

假设我需要 SocketHandler (ClientSocketHandler) 中的 CoreContext 实例。我该怎么做呢?我觉得有一种非常简单的方法,但我一直不明白那是什么。

是否有我没有看到的更简单的调用堆栈,或者什么?请注意,我更愿意按照我现在的方式执行此操作,即对象初始化,而不是稍后分配属性。

var coreContext = new CoreContext
{
ConfigHandler = new JsonConfigHandler(),
SocketHandler = new ClientSocketHandler(coreContext, IPAddress.Parse(""), 30),
PacketProvider = new PacketProvider
{
Events = new Dictionary<short, Action<ICoreContext, IIncomingPacket>>
{
{ IncomingPacketIds.AuthError, AuthErrorEvent.Process },
{ IncomingPacketIds.DeviceInformation, DeviceInformationEvent.Process },
{ IncomingPacketIds.AuthComplete, AuthCompleteEvent.Process },
}
}
};

最佳答案

如果您使用构造函数注入(inject)传递工厂委托(delegate)来创建 ClientSocketHandler,您可以避免这个问题,但我不完全确定这是在创建后简单设置属性的改进。

(好吧,构造函数注入(inject)(IMO)比属性注入(inject)更好的改进。)

无论如何,这里有一个例子,以防它对你有用。

请注意使用 context => new ClientSocketHandler(context) 将工厂委托(delegate)传递给 CoreContext 构造函数。

然后在 CoreContext 构造函数中,您可以将 this 传递给委托(delegate)。

using System;

namespace Demo
{
class Program
{
public static void Main(string[] args)
{
var coreContext = new CoreContext(context => new ClientSocketHandler(context))
{
ConfigHandler = new ConfigHandler()
};
}

class ConfigHandler {}

class ClientSocketHandler
{
readonly CoreContext _coreContext;

public ClientSocketHandler(CoreContext coreContext)
{
_coreContext = coreContext;
}
}

class CoreContext
{
public CoreContext(Func<CoreContext, ClientSocketHandler> socketHandlerFactory)
{
SocketHandler = socketHandlerFactory(this);
}

public ClientSocketHandler SocketHandler { get; private set; }
public ConfigHandler ConfigHandler { get; set; }
}
}
}

请注意,如果您使用构造函数注入(inject),则可以省略 SocketHandler 的 setter。另请注意,您应该通过接口(interface)注入(inject),但为简洁起见,我省略了它。我假设您不想在构造函数中 new 创建 ClientSocketHandler 的实例!

关于c# - 使用对象初始化时,如何获取父类的实例,即发起当前类的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51826855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com