65.9K
CodeProject 正在变化。 阅读更多。
Home

声明生成器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2010年6月25日

GPL3

3分钟阅读

viewsIcon

20884

downloadIcon

145

一个帮助生成事件/属性代码的工具,以便您的类的用户可以使用嵌入类的事件/属性

引言

如果您正在开发一个[用户控件](或[类]),
如果您的[用户控件]包含其他[控件](按钮,文本框,标签,.......等等),
如果您想公开嵌入控件的事件/属性,

您有两个选择

  1. 重新编写您需要的每个事件的声明,并逐个引发它们。 如果你想公开所有事件/属性,那将花费很长时间。 如果您有多个嵌入控件,那么就开始吧,您的学生会完成它。
  2. 将嵌入控件的“可访问级别”(修饰符)设置为允许从您的[用户控件]外部查看它们,例如“Public”。
    然后,您的[用户控件]的用户必须编写如下代码才能使用事件
    Dim WithEvents EmbeddedControl As New EmbeddedControlType
    
    Private Sub SomeSub()
    
        'now " UserControl1" is an object of Your UserControlType
        EmbeddedControl = UserControl1.EmbeddedControl
    End Sub
    
    Private Sub HandlerSub(ByVal Sender As Object, ByVal e As EventArgs) _
            Handles EmbeddedControl.EventName
    
            'do your thing 
    End Sub

    请注意,用户必须意识到他所做的每一件事,因为 IDE 不会帮助他创建“Sub”“HandlerSub”,……除此之外,他做了不必要的事情。

所以…………
这是一个帮助您为嵌入控件生成事件/属性声明的工具(选项 1),因此您的[用户控件]的用户必须编写如下代码才能使用事件

Private Sub UserControl1_EmbeddedControlEventName( _
    ByVal Sender As Object,  ByVal e As System.EventArgs) _
    Handles UserControl1. EmbeddedControlEventName

        'do your thing
    End Sub

除此之外,用户将使用 IDE 创建“Sub”“Tool_EmbeddedToolEventName”。

这是该工具的屏幕截图

DeclarationsGenerator.gif

未来的想法

  1. 生成属性/事件属性和 XML 注释(该过程已开始,但在当前版本中结果并不令人满意)。
    我可以等到工具准备好,但我选择不等待,因为我不会很快开发这个想法,并且我想让人们现在使用它,如果他们喜欢它(而不是等待我)。
  2. 通过允许用户添加程序集以搜索数据类型,在其他程序集中进行搜索,它不会花费太多时间来编程,但我尚未支持它。

背景

显然,该工具全部关于反射,并且需要导入命名空间System.Reflection

Imports System.Reflection

还有一件事,我使用了扩展方法来使代码架构更方便,更强大,它需要导入命名空间System.Runtime.CompilerServices

Imports System.Runtime.CompilerServices

Using the Code

例如,负责生成事件声明的代码是

#Region "Extending the 'EventInfo' Type"
    <Extension()> _
     Private Function GetEventDeclaretion(ByVal eve As EventInfo, _
                                          ByVal ControlName As String _
                                          ) As String

        Dim DelegateType As Type = eve.EventHandlerType
        Dim Invoke As MethodInfo = DelegateType.GetMethod("Invoke")
        Dim Pars As ParameterInfo() = Invoke.GetParameters()

        Dim EventName As String = ControlName & eve.Name

        Dim ParamsNamesArr = (From p In Pars Select p.Name).ToArray
        Dim ParamsNamesStr As String = " ( " & String.Join(" , ", ParamsNamesArr) & " )"

        Dim paramsDeclarationsArr = (From p In Pars _
                                     Select (p.Name & " As " & p.ParameterType.ToString) _
                                    ).ToArray
        Dim paramsDeclarationsStr As String = " ( " & String.Join(" , ", _
			paramsDeclarationsArr) & " )"

        Dim EventInvokeMethodeName As String = String.Format("{0}{1}{2}", _
                                    ControlName, eve.Name, paramsDeclarationsStr)

        Dim RaiseEventStatment As String = vbTab & "RaiseEvent " & _
				EventName & ParamsNamesStr

        Dim EventDeclaration As String = "Public Event " & _
				EventInvokeMethodeName & vbCrLf
        EventDeclaration &= String.Format("Private Sub m_{0} _
				Handles {1}.{2}{4}{3}{4}End Sub{4}", _
                                      EventInvokeMethodeName, ControlName, eve.Name, _
                                      RaiseEventStatment, vbCrLf)
        Return EventDeclaration
    End Function
#End Region

所以稍后,您可以将其用作下一个

Dim Eve As EventInfo = GetType(SomeType).GetEvent("SomeEvent")
Dim Declaration As String = Eve.GetEventDeclaretion()

历史

这个想法是在一段时间之前产生的,当时我想创建一个包含著名组合(BrowseButton + PathTextBox)的 UserControl。 我希望用户能够访问嵌入控件的成员。 我在互联网上搜索了所有内容,每个人都说我必须对它们进行硬编码,所以我制作了这个工具并使用了它。 对我来说就像魔法一样。

几天前,我想与你们分享这个工具,所以想到了一些未来的想法,但因为我不打算很快开发它,所以我把它放在了原来的样子。

版本 0.0.0.3 生成事件和属性(推荐,稳定)。 我开始在版本(0.0.0.4)中支持属性生成,但结果并不令人满意(选择正确的构造函数不起作用)。

我希望它对某人有帮助。 感谢阅读。

© . All rights reserved.