我目前有一个检测器接口(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/