【问题标题】:How to loop through each discrete instance of a class within another instance of a different class and call a specific method如何在不同类的另一个实例中循环遍历类的每个离散实例并调用特定方法
【发布时间】:2011-10-18 02:55:55
【问题描述】:

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

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() 方法。

【问题讨论】:

    标签: c# class reflection


    【解决方案1】:

    你必须在这里使用接口:

    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 用于使用界面。还提供编译时类型安全。
    【解决方案2】:

    假设你说的成员是属性,你可以做如下非常难看的代码:

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

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

    【讨论】:

    • 我希望这样做,因为我在开发这个类时添加了更多属性,并且不想继续更新一个巨大的 doStuff() 方法。分开的方法。每个属性的值都是随机生成的,但每个类类型都有自己的随机生成方法。这允许用户一次随机生成项目的每个属性,或者使用一种方法一次生成所有属性。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-23
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 2018-08-05
      • 1970-01-01
      • 2019-10-27
      相关资源
      最近更新 更多