在GUI中使用从基础继承的许多类

时间:2010-10-20 15:39:36

标签: c# vb.net class abstract-class

我的课程设置与此类似:

<DataContract()> _
Public MustInherit Class SystemTaskProcessBase

    Public MustOverride ReadOnly Property Name() As String
    Public MustOverride ReadOnly Property Description() As String

    Public MustOverride Property Result() As SystemTaskResult

    <DataMember()> _
    Private _TaskID As Integer = 0
    Public Property TaskID() As Integer
        Get
            Return _TaskID
        End Get
        Set(ByVal value As Integer)
            _TaskID = value
        End Set
    End Property

End Class

<DataContract()> _
Public Class RebootSystemTaskProcess
    Inherits SystemTaskProcessBase

    Private _Name As String = "Reboot System"
    Public Overrides ReadOnly Property Name() As String
        Get
            Return _Name
        End Get
    End Property

    Private _Description As String = "Task for the client to reboot itself internally."
    Public Overrides ReadOnly Property Description() As String
        Get
            Return _Description
        End Get
    End Property

    <DataMember()> _
    Public _Result As SystemTaskResult = SystemTaskResult.NotProcessed
    Public Overrides Property Result() As SystemTaskResult
        Get
            Return _Result
        End Get
        Set(ByVal value As SystemTaskResult)
            _Result = value
        End Set
    End Property

End Class

<DataContract()> _
Public Class DeleteFileSystemTaskProcess
    Inherits SystemTaskProcessBase

    Private _Name As String = "Delete File"
    Public Overrides ReadOnly Property Name() As String
        Get
            Return _Name
        End Get
    End Property

    Private _Description As String = "Task for the client to delete a local file."
    Public Overrides ReadOnly Property Description() As String
        Get
            Return _Description
        End Get
    End Property

    <DataMember()> _
    Public _Result As SystemTaskResult = SystemTaskResult.NotProcessed
    Public Overrides Property Result() As SystemTaskResult
        Get
            Return _Result
        End Get
        Set(ByVal value As SystemTaskResult)
            _Result = value
        End Set
    End Property

    <DataMember()> _
    Private _File As FileInfo
    Public Property File() As FileInfo
        Get
            Return _File
        End Get
        Set(ByVal value As FileInfo)
            _File = value
        End Set
    End Property

End Class

我需要在客户端系统上使用这些类,但还需要能够通过管理界面创建这些“任务”。继承基类的每个类(Task)都可以拥有自己的属性,这些属性对每个类都是唯一的,但同时共享相同的公共基类属性。例如,上面显示了重启任务和删除文件任务,删除文件任务需要知道要删除哪个文件,因此具有该属性。但重启任务不需要此属性。因此,当管理应用程序创建这些任务时,它不应为重新启动任务的文件属性提供文本框。以后可能会创建更多具有完全不同属性的任务。

如何为WinForms管理应用程序提供一种将每个类枚举到ListView中的方法,并允许用户创建这些任务并填写每个类所具有的动态属性?

所需的功能是创建一个任务表单,根据需要创建可用于属性的动态控件,具体取决于每个类中的公共属性,但同时也可以使用基类属性。

任何想法都表示赞赏。

谢谢, 斯科特

1 个答案:

答案 0 :(得分:0)

如果您需要高度可定制和可扩展的解决方案,那么实现它的一种方法是日期驱动方法。在我以前的一个工作中,我们必须根据客户端首选项创建一个动态UI,其中字段1适用于一个客户端,但另一个客户端不需要相同。将该方法扩展到您的问题,您将需要具有数据库表

TasksTable with following columns
1.TaskId
2.TaskName
3.ClassName  (you will use reflection to create an instance of it)

另一个包含任务实际字段的表。我们现在称它为TaskFields。

TaskFields Table 
1. TaskFieldId
2. Property   (You can create another field to store the Name if you need to)
3. Enabled (bit)
4. SpecialFormat   <if you need to apply this and customize it based on some preference)

这些是相当小的表格。在应用启动时加载它们。在您的应用程序中,将ListBox绑定到TasksTable中的TaskName字段。 选择特定项目后,根据所选项目的TaskFields表中的值动态创建控件。基于ClassName字段创建类,并将create bindings与生成的控件相关联。

这很复杂,但您获得的优势是可以关闭/打开控件以显示。

编辑: 如果您打算使用属性方法,以下可能会很方便。根据您的示例,您已经将所需的属性标记为Datamember。因此,您不必定义任何自定义属性,除非您有其他属性不会用于用户输入,但为了其他目的将自己标记为DataMember。

Dim type As Type = GetType(yourClass)
Dim properties As PropertyInfo() = type.GetProperties()
Dim neededProperties = (From [property] In propertiesLet attributes = DirectCast([property].GetCustomAttributes(GetType(DataMemberAttribute), False), Attribute()) Where attributes.Count() > 0[property]).ToList()