我有一个类,它使用各种方法和其他类作为其成员。在其中一种方法中,它执行以下操作:
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()方法。
答案 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);
}
但正如已经提到的,这似乎是您的架构的一个问题。