我在
中有一个具有未确定方法数量的类Public Class MyClass
Public Sub Foo()
End Sub
Public Sub Bar()
End Sub
End Class
是否有一种简单的方法可以调用“MyClass”中的所有方法而无需实际指定每个方法?原因是“MyClass”中的方法将会不断增长,而且当最终目标是按照设定的时间表执行每个方法时,我不想为每个方法指定方法调用。
IE:我想避免
Page_Load
Foo()
Bar()
我已经尝试了以下代码来遍历这些方法,但是我收到了错误
Public Shared Sub Calculator()
Dim methods As New Methods()
For Each Info As MethodInfo In methods.GetType.GetMethods
Info.Invoke(Nothing, Nothing)
Next
End Sub
System.Reflection.TargetException:非静态方法需要目标。
答案 0 :(得分:2)
您希望Type.GetMethods获取方法列表,然后使用MethodInfo.Invoke来调用它。
虽然听起来像你这样做是错误的。我建议您查看委托和事件,而不是使用反射来调用类中的每个方法。这样,类可以注册自己来调用而不是依赖启发式来进行调用(例如,如果你向MyClass
类添加了一个“帮助器”方法会发生什么您没有想要被召唤?)
例如,以下是使用事件执行此操作的方法:
class MySchedule
{
public event EventHandler Fire;
public void Tick()
{
if (Fire != null) {
Fire(this, EventArgs.Empty);
}
}
}
class MyClass
{
public void Register(MySchedule sched)
{
sched.Fire += Foo;
sched.Fire += Bar;
}
void Foo(object source, EventArgs e)
{
}
void Bar(object source, EventArgs e)
{
}
}
我使用了内置的EventHandler
委托,但如果您希望方法具有指定的签名,则可以使用您喜欢的任何内容。
答案 1 :(得分:1)
这是一个简单的例子,调用不带参数的方法:
Sub Main()
Dim FooClass As New someClass()
For Each method As MethodInfo In FooClass.GetType.GetMethods(BindingFlags.Instance Or
BindingFlags.Public Or
BindingFlags.DeclaredOnly)
Console.WriteLine("Invoking: {0}.{1}()", method.DeclaringType.Name, method.Name)
method.Invoke(FooClass, Nothing)
Next
End Sub
答案 2 :(得分:0)
http://msdn.microsoft.com/en-us/library/aa332480(v=VS.71).aspx
我认为这就是你要找的东西。 .NET Reflection允许您非常轻松地执行此操作。