.net循环遍历类中的方法

时间:2010-06-21 01:02:46

标签: .net

我在

中有一个具有未确定方法数量的类
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:非静态方法需要目标。

3 个答案:

答案 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允许您非常轻松地执行此操作。