如何让核心类调用客户端类

本文关键字:调用 客户端 核心 | 更新日期: 2023-09-27 18:15:41

我正在尝试构建一个使用插件的核心应用程序,这样核心就永远不会改变,每次我们得到新的客户端时,我们都会为它们编写一个模块。我们用新的客户类实现了一个名为IClientPlugin的接口。

这是使用Compact Framework 3.5和windows mobile 6.5.3。

所以我需要做的是:

这是一个仓库管理系统。第一项任务是从卡车上接收产品,用手持设备扫描包裹上的条形码。

当用户点击接收菜单项时,核心模块就会启动。

核心方法是-callClientMethod()

我知道客户端名称,它在登录时存储在一个全局变量中,类将是{clientname}.cs并包含一个称为CCD_ 3的方法。

我知道如何实例化这个对象。

问题是:有没有一种方法可以在不硬编码case语句的情况下动态创建客户端类的实例?

例如,假设我有两个客户端Acme和Widgets。它们各自获得一个客户端类,即Acme.csWidgets.cs

如果我以Acme或Widgets的身份登录,我希望代码动态地创建我登录的Client类的实例,这样,只要我为它们添加了一个模块,核心代码就不必在添加更多客户端时发生更改。

psuedo示例:

var myClient = New (Clientname)();

这可能吗,或者有更好的设计方法,或者switch/case语句是一种必要的邪恶吗?

如何让核心类调用客户端类

您可以使用反射来动态创建对象。加载类型或程序集的方法有很多。让我们从一个简单的开始:

Type clientType = Type.GetType("AssemblyName, TypeName");
IClientPlugin clientPlugin = 
                   (IClientPlugin)Activator.CreateInstance(clientType);    

如果您的客户端名为myClient1,并且您有一个约定,即您的程序集的名称为Clients.ClientName.dll等,则您可以编写一个函数:

IClientPlugin CreatePluginInstance(string clientName) {
    string typeName = string.Format("Clients.{0}, {0}", clientName);
    Type clientType = Type.GetType(typeName);
    IClientPlugin clientPluginInstance = 
                      (IClientPlugin)Activator.CreateInstance(clientType);    
    return clientPluginInstance;
}

编辑

如果你的插件类与你的主项目位于同一个程序集中,你可以简化Type.GetType的调用,只指定类名:

Type.GetType(clientName);
var myClient = Activator.CreateComInstanceFrom("Acme.dll","Acme");

其中可以参数化部件名称和类型名称。