一般地宣告课程

时间:2019-06-04 07:40:43

标签: .net vb.net

我有一个Windows服务,该服务从客户端的打印机软件收集数据。

Windows服务包含每个打印机软件包的类列表:

    cls软件A
    cls软件B

尽管每个类都具有相同的功能,但该类中的每个功能都可以完成一些工作,以从不同系统中获取标准数据列表。

因此,当服务启动时,它将确定打印机系统和所需的类。

Dim clsPrinter As Object
Dim strPSClassName As String

strPSClassName = GetPrinterClass(ClientID) 'Get ClassName for the Client

clsPrinter = CreateObject(strPSClassName)

我需要以某种方式根据类的名称分配给特定类的对象。

2 个答案:

答案 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/