如何在不同类的另一个实例中循环遍历类的每个离散实例,并调用特定方法
本文关键字:实例 方法 调用 遍历 同类 另一个 循环 | 更新日期: 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();