如何在另一个类的另一个实例中遍历类的每个离散实例并调用特定方法

时间:2011-10-18 02:55:56

标签: c# class reflection

我有一个类,它使用各种方法和其他类作为其成员。在其中一种方法中,它执行以下操作:

MyObject.member1.doStuff();
MyObject.member2.doStuff();
MyObject.member3.doStuff();
MyObject.member4.doStuff();

我想做这样的事情:

foreach Member in MyObject
{
    foreach Method in Member
        {
            if (Method.Name == "doStuff")
                { Method.Invoke() }
        }
}

每个成员都有不同的类类型,它们唯一共同点是它们都有一个名为doS​​tuff()的void方法。我不能将所有方法组合成一个巨大的doStuff()方法。

3 个答案:

答案 0 :(得分:3)

你必须在这里使用界面:

static void Main(string[] args)
{

    MyClass mc = new MyClass();
    mc.doStuff();
}

interface IMember
{
    void doStuff();
}

class Member1 : IMember
{
    public void doStuff()
    {
        Console.WriteLine("Member1");
    }
}

class Member2 : IMember
{
    public void doStuff()
    {
        Console.WriteLine("Member2");
    }
}

class Member3 : IMember
{
    public void doStuff()
    {
        Console.WriteLine("Member3");
    }
}

class Member4 : IMember
{
    public void doStuff()
    {
        Console.WriteLine("Member4");
    }
}

class MyClass
{
    public Member1 member1 = new Member1();
    public Member2 member2 = new Member2();
    public Member3 member3 = new Member3();
    public Member4 member4 = new Member4();

    public void doStuff()
    {
        IMember[] members = { member1, member2, member3, member4 };
        foreach (IMember member in members)
            member.doStuff();
    }
}

答案 1 :(得分:1)

如果必须对类似属性的方法调用使用反射,则意味着您的代码很可能设计不合理。

如果你已经知道这些方法,你可以将它们放入Action数组中,但是:

Action [] methods= { MyObject.member1.doStuff, MyObject.member2.doStuff, 
                     MyObject.member3.doStuff, MyObject.member4.doStuff};

foreach(var method in methods)
    method();

答案 2 :(得分:1)

假设您正在谈论的成员是属性,您可以执行以下非常难看的代码:

foreach (var property in MyObject.GetType().GetProperties()
    .Select(pi => pi.GetValue(MyObject, null)))
{
    property.GetType().GetMethod("doStuff").Invoke(property, null);
}

但正如已经提到的,这似乎是您的架构的一个问题。