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

标签 c# .net

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

相关文章:

c# - 如何选择与对象列表中的属性值共享属性值的所有对象?

c# - c# 中 onFormClosing 的问题

javascript - anchor 标记上的 JQuery click() 未从 WebBrowser 控件内的注入(inject)脚本触发

c# - (Random.NextDouble() < 1) 的用途是什么

c# - MVC、ORM 和数据访问模式

c# - 在下拉列表上绑定(bind)数据

c# - 如何在 Windows 窗体应用程序设置中记录窗口位置

c# - ExecuteNonQuery 不更新输出参数

c# - 实时环境中的 WCF 或套接字通信?

c# - .NET:我是否需要在异步下载时保留对 WebClient 的引用?