c# - 如何让核心类调用客户端类?

标签 c# .net compact-framework windows-mobile-6.5

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

这是使用 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 语句是否是一个必要的邪恶?

最佳答案

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

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);

关于c# - 如何让核心类调用客户端类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8238698/

相关文章:

c# - 为什么 TextRenderer.MeasureText 不能正常工作?

c# - 如何使用 Linq 表达式在 Telerik Radgridview 中查找隐藏列

.net - .Net 4.5 是否支持 XML 1.1(对于 XML 1.0 中无效的字符)?

.net - 如何设置或清除 Windows Mobile 设备使用的代理服务器?

c# - 如何在 C# 中将输出格式化为两位小数和 '$' 符号?

c# - Svcutil 在 DataContractAttribute 中生成错误的 Name 属性值

c# - 在表格单元格中叠加两张图片

c# - 我如何验证日期不是 .net c# 中的 future 日期

vb.net - 测试字符串是否可以在 VB.NET 中转换为整数

c# - 允许迭代而不产生任何垃圾