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

本文关键字:实例 方法 调用 遍历 同类 另一个 循环 | 更新日期: 2023-09-27 18:11:37

我有一个使用各种方法和其他类作为其成员的类。在其中一个方法中,它做了这样的事情:

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

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

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

你必须在这里使用interface:

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

假设您正在讨论的成员是属性,您可以编写以下非常丑陋的代码:

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

但是正如已经提到的,这似乎是您的体系结构的问题。

如果你必须对这样的属性的方法调用使用反射,这意味着你的代码很可能是设计不良的。

如果你已经知道了这些方法,你可以把它们放到Action数组中:

Action [] methods= { MyObject.member1.doStuff, MyObject.member2.doStuff, 
                     MyObject.member3.doStuff, MyObject.member4.doStuff};
foreach(var method in methods)
    method();