我有一个Windows服务,该服务从客户端的打印机软件收集数据。
Windows服务包含每个打印机软件包的类列表:
尽管每个类都具有相同的功能,但该类中的每个功能都可以完成一些工作,以从不同系统中获取标准数据列表。
因此,当服务启动时,它将确定打印机系统和所需的类。
Dim clsPrinter As Object
Dim strPSClassName As String
strPSClassName = GetPrinterClass(ClientID) 'Get ClassName for the Client
clsPrinter = CreateObject(strPSClassName)
我需要以某种方式根据类的名称分配给特定类的对象。
答案 0 :(得分:0)
您将必须写出条件,并在满足条件时(用于当前设备的名称)在此处实例化对象。
string MyDeviceName;
MyDeviceName = "whatever you find the current device to be";
switch (MyDeviceName)
{
case "Printer A":
//Do something here
break;
case "Printer B":
//Do something else here
break;
default:
break;
}
答案 1 :(得分:0)
如果您只有两节课(并且永远只有两节课),那么我建议您参考路易的答案。但是,如果您有更多的对象,或者希望以后再添加更多的对象,则基于反射的工厂不需要为其他对象类型进行任何额外的编码,只需要对可创建对象进行一些样板代码即可。>
您需要从各个类型将要实现的接口或基类类型开始。
Interface IFactoryObject
'...
End Interface
您还需要一个约定,说明对象如何说出它们可以处理的内容。对于此示例,我将假设:
Public Shared Function GetObjectName As String
在此示例中,我假设对象只是使用其构造函数创建的,但是您也可以按照约定公开一个自创建方法。
设置工厂涉及扫描一个或多个装配以查找符合要求的类型,例如
Private Shared _ctors As New Dictionary(Of String, System.Reflection.ConstructorInfo)
Public Shared Sub InitializeFactory(ByVal assembly As System.Reflection.Assembly)
For Each thisType In assembly.GetTypes()
If GetType(IFactoryObject).IsAssignableFrom(thisType) Then
Dim typeMethodInfo = thisType.GetMethod("GetObjectName", System.Reflection.BindingFlags.Static Or System.Reflection.BindingFlags.Public)
'Validation that typeMethodInfo is not Nothing, has the right argument type(s), and has the right return type left as an exercise for the reader
Dim typeDelegate = DirectCast(typeMethodInfo.CreateDelegate(GetType(Func(Of String))), Func(Of String))
Dim typeName = typeDelegate.Invoke()
Dim ctor = thisType.GetConstructor({})
_ctors.Add(typeName, ctor)
End If
Next
End Sub
然后,实际的运行时创建是这样的:
Public Shared Function CreateFactoryObject(ByVal objectName As String) As IFactoryObject
Dim createdObject As Object = _ctors(objectName).Invoke({})
Return CType(createdObject, IFactoryObject)
End Function
请注意,这不是最快的代码,因为它使用的是反射方式。乔恩·斯凯特(Jon Skeet)在2008年谈到了将MethodInfo
转换为委托实例的情况:https://codeblog.jonskeet.uk/2008/08/09/making-reflection-fly-and-exploring-delegates/