C# 如何获取父类的实例,即在使用对象初始化时启动当前类的类?
我经常遇到这种情况。我终于找到了一个答案,我该如何做到这一点。我知道有很多方法,但大多数都是肮脏的,包括不良做法 只是想说明一下,这不是征求你的意见,而是询问大多数程序员如何处理这类问题,几乎所有可能的方式都不包括真正糟糕的代码 我有一个名为C# 如何获取父类的实例,即在使用对象初始化时启动当前类的类?,c#,.net,C#,.net,我经常遇到这种情况。我终于找到了一个答案,我该如何做到这一点。我知道有很多方法,但大多数都是肮脏的,包括不良做法 只是想说明一下,这不是征求你的意见,而是询问大多数程序员如何处理这类问题,几乎所有可能的方式都不包括真正糟糕的代码 我有一个名为CoreContext的类,我将新实例注入属性的类名中,如下所示。但是当我需要启动该类的父类时会发生什么呢 假设我需要SocketHandler(ClientSocketHandler)内部的CoreContext实例。我该怎么做呢?我觉得有一个非常简单的方
CoreContext
的类,我将新实例注入属性的类名中,如下所示。但是当我需要启动该类的父类时会发生什么呢
假设我需要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 },
}
}
};
var coreContext=新的coreContext
{
ConfigHandler=new JsonConfigHandler(),
SocketHandler=newclientsockethandler(coreContext,IPAddress.Parse(“”,30),
PacketProvider=新的PacketProvider
{
事件=新字典
{
{IncomingPacketIds.AuthError,AuthErrorEvent.Process},
{IncomingPacketIds.DeviceInformation,DeviceInformationEvent.Process},
{IncomingPacketIds.AuthComplete,AuthCompleteEvent.Process},
}
}
};
如果使用构造函数注入传递工厂委托来创建ClientSocketHandler
,则可以避免此问题,但我不能完全确定这是否是对创建后简单设置属性的改进
(好吧,这是一个改进,构造函数注入(IMO)比propery注入更好。)
无论如何,这里有一个例子,以防对你有用
注意使用context=>newclientsockethandler(context)
将工厂委托传递给CoreContext
构造函数
然后在CoreContext
构造函数中,您可以将此
传递给代理
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; }
}
}
}
使用系统;
名称空间演示
{
班级计划
{
公共静态void Main(字符串[]args)
{
var coreContext=newcorecontext(context=>newclientsockethandler(context))
{
ConfigHandler=新的ConfigHandler()
};
}
类ConfigHandler{}
类ClientSocketHandler
{
只读CoreContext _CoreContext;
公共客户端SocketHandler(CoreContext CoreContext)
{
_coreContext=coreContext;
}
}
类核心上下文
{
public CoreContext(Func socketHandlerFactory)
{
SocketHandler=SocketHandler工厂(本);
}
公共客户端SocketHandler SocketHandler{get;private set;}
公共ConfigHandler ConfigHandler{get;set;}
}
}
}
注意,如果使用构造函数注入,可以省略
SocketHandler
的setter。还要注意,您应该通过接口进行注入,但为了简洁起见,我省略了这一点。我假设您不想new
在构造函数中创建ClientSocketHandler
的实例 在我看来,您最好使用构造函数注入。有没有一个你不能这么做的原因?主要原因是它被认为是一条漫长的道路,当属性注入变得简单得多的时候。即使使用构造函数注入(在我的脑海中看到这一点)也会让我陷入同样的境地。如果你是认真的,如果你发布一个带有代码示例的答案可能会有所帮助。如果你的意思是在CoreContext的构造函数中初始化类(我想你不会,但只是以防万一),而不仅仅是将ClientSocketHandler的实例传递到构造函数中,那是因为我使用的是依赖注入,所以我不能这么做。在对象创建之后分配属性有什么问题吗?您发布的代码无法工作,因为您无法传递对未初始化的对象的引用Yet使用对象初始化似乎更干净,我仍然认为在对象创建后分配可能有一种更干净的方法,所以我将保留此问题。谢谢,但我决定在创建对象后进行属性注入,因为它没有太大的不同,只是看起来是最干净的方式。@fskdjwe是的,我想这就是我在本例中应该采用的方式。