2

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

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

所以这是我需要实现的:

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

核心模块在用户单击接收菜单项时启动。

核心方法是——callClientMethod()

我知道客户端名称,它在登录时存储在全局变量中,并且该类将{clientname}.cs 包含一个名为processReceiving().

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

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

例如,假设我有 2 个客户端 Acme 和 Widgets。他们每个人都有一个客户类,Acme.csWidgets.cs

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

伪示例:

var myClient = New (Clientname)();

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

4

2 回答 2

1

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

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);
于 2011-11-23T08:13:11.770 回答
0
var myClient = Activator.CreateComInstanceFrom("Acme.dll","Acme");

您可以在其中参数化程序集名称和类型名称。

于 2011-11-23T08:16:00.087 回答