简体   繁体   中英

How to loop through each discrete instance of a class within another instance of a different class and call a specific method

I have a class that uses a variety of methods and other classes as its members. In one of these methods, it does something like this:

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

etc.

I would like to do something like this instead:

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

Each member is of a different class type, the only thing they have in common is they will all have a void method called doStuff(). I cannot combine all methods into one giant doStuff() method.

you have to use interface here:

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();
    }
}

If you have to use reflection for method calls on properties like that it means your code is most likely ill-designed.

If you know the methods already you can just put them into an Action array though:

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

foreach(var method in methods)
    method();

Assuming the members you are talking about are properties, you can do the following very ugly code:

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

But as has been mentioned, it seems like a problem with your architecture.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM