gpt4 book ai didi

c# - 在不调用构造函数的情况下将对象存储在字典中

转载 作者:太空宇宙 更新时间:2023-11-03 18:55:48 25 4
gpt4 key购买 nike

我目前有一个检测器接口(interface),称为“模型”。在我的工厂类中,我有一个名为 CreateDetector 的函数,它返回检测器的适当模型。

public Detector CreateDetector(string modelName, string ip, string port) {
if ( modelName = "A" )
{
return new ModelA(ip, port);
}
if ( modelName = "B" )
{
return new ModelB(ip, port);
}
...
}

对我来说,这似乎相当低效,而且代码会重复多次。在类似的情况下,我通常会使用以下方法。

public Detector CreateDetector(string modelName, string ip, string port) {
Dictionary<string, Detector> detectors = new Dictionary<string, Detector>()
{
{ "A", new ModelA(ip, port) },
{ "B", new ModelB(ip, port) },
...
};
return detectors[modelName]
}

但是,在 Detector 的当前实现中,基础构造函数总是调用 Init(),它会尝试连接到设备。显然,我不想将设备连接 X 次,因为这可能会导致很多问题。 (这部分是让我问这个问题的原因,我知道构造函数不应该很重,但这是不会更改的遗留代码。)

我希望最终结果模拟这样的事情,其中​​字典只包含对象的声明,但只有在确定您使用的是哪个类后才会调用构造函数。

public Detector CreateDetector(string modelName, string ip, string port) {
Dictionary<string, Detector> detectors = new Dictionary<string, Detector>()
{
{ "A", ModelA(ip, port) },
{ "B", ModelB(ip, port) },
{ "C", ModelC(ip, port) },
...
{ "X", ModelX(ip, port) },
};
if (modelName = "B" || modelName = "C")
{
//special case for these 2 models
}
return new detectors[modelName]
}

我想要完成的是停止重复出现的“if/else”,它们都是相同的,但在我请求它的值之前不初始化构造函数。

最佳答案

我会在你的类中有以下静态字段:

static Dictionary<string, Func<string, string, Detector>> _detectors = new Dictionary<string, Func<string, string, Detector>>()
{
{ "A", (ip, port)=> new ModelA(ip, port) },
{ "B", (ip, port)=> new ModelB(ip, port) }
};

字典的值是一个对象工厂方法:

var factory = _detectors[modelName];  // returned type is Func<string, string, Detector>
var result = factory(ip, port);

关于c# - 在不调用构造函数的情况下将对象存储在字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45717839/

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