【问题标题】:Get AddressOf from MethodInfo object从 MethodInfo 对象获取 AddressOf
【发布时间】:2016-10-26 20:22:31
【问题描述】:

我有以编程方式创建的标签,并希望为每个标签提供特定的事件处理程序。所以,不要这样做:

AddHandler Label1.Click, AddressOf SomeSub1
AddHandler Label2.Click, AddressOf SomeSub2
AddHandler Label3.Click, AddressOf SomeSub3
...

我希望将它变成一个循环以避免上述情况。所以我做了:

  • 标签列表
  • 我已经构建的所有私有子类的 MethodInfo 数组,该类继承自标签所在的主类

我使用了上面的内容并想出了以下内容:

Dim separateClass As New SeparateClass
Dim methodInfo() As MethodInfo = separateClass.GetType.GetMethods(BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly)

For i As Integer = 0 to End
    labelList.Add(New Label())
    AddHandler labelList.Last.Click, AddressOf [Delegate].CreateDelegate(GetType(SomeDelegate), separateClass, methodInfo(i)).GetMethodInfo
Next

这确实可以编译,但没有触发 Subs。以下代码也可以编译,但行为方式相同:

For i As Integer = 0 to End
    labelList.Add(New Label())
    AddHandler labelList.Last.Click, AddressOf methodInfo(i).getBaseDefinition
Next

有没有办法可以从MethodInfo 对象中获取适当的AddressOf

【问题讨论】:

  • 可能更容易制作自定义控件并覆盖onClick事件stackoverflow.com/questions/6405458/…
  • 您在 New Label() 上注册 Click 事件,而不是您在表单上使用的标签。 New 关键字在这里是描述性的。可以肯定的是,这是行不通的,这些标签甚至都不可见。
  • 我删掉了很多额外的东西来将它们添加到我的 MainForm 中。它们被添加,给定文本、字体、大小和其他地方的所有东西。我只是没有在这里做,所以只有我遇到问题的部分可以专注于。很抱歉造成混乱。

标签: vb.net


【解决方案1】:

[Delegate].CreateDelegate 已经创建了一个委托对象;你不应该使用AddressOf

不过,您可能需要投射它。

【讨论】:

  • 伙计……我不擅长这个吗?当已经有一个名为 EventHandler 的内置函数时,我创建了一个 EventDelegate -.- 我进行了您建议的更改,这完全修复了它。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多