Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取父类的实例,即在使用对象初始化时启动当前类的类?_C#_.net - Fatal编程技术网

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是的,我想这就是我在本例中应该采用的方式。