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.