Головоломка с архитектурой приложения - C#
Формулировка задачи:
Доброго времени суток. Для начала опишу вкратце ситуацию. Допустим есть следующий интерфейс
Есть несколько классов, которые реализуют этот интерфейс. Для примера рассмотрим класс который реализует это интерфейс и + имеет свой собственный метод OwnMethod(). Каждый из методов (А,В,С) вызывает OwnMethod со своими параметрами
Также есть набор классов реализующих этот интерфейс, но без дополнительных методов: Class1, Class2, Class3...
Внимание вопрос: реально ли вообще сделать какое нибудь действие во время вызова OwnMethod, чтобы внутри него без лишних телодвижений сделать следующее, например:
если я вызвал OwnMethod внутри MyClass.A(),то чтобы внутри OwnMethod можно было вызвать A() для всех классов которые реализуют этот интерфейс (классы собраны в колекцию)
Может немного неясно пояснил, извините расписал как смог.
Мои идеи:
1) При условии что А, В и С имеют одинаковую сигнатуру,описать делегат, в OwnMethod в параметрах объявить переменное число параметров этого делегата , и в вызове MyClass.A()/MyClass.В()/MyClass.С() в параметры OwnMethod передавать конкретные объекты с их параметрами. (Мне этот вариант нравится больше всего)
2) Расширить классы методами ExecuteOperation() - метод который принимает строку с именем метода, и switcом выбирает необходимый метод на выполнения (по моему это очень тупорыло).
Может у кого есть собственный взгляд на этот вопрос. Буду рад услышать чье то мнение. Спасибо.
interface IMyInterface
{
void A();
void B();
void C();
}public class MyClass
{
public void A()
{
//OwnMethod(параметры 1)
}
public void B()
{
//OwnMethod(параметры 2)
}
public void C()
{
//OwnMethod(параметры 3)
}
public void OwnMethod()
{
//Method
}
}Решение задачи: «Головоломка с архитектурой приложения»
textual
Листинг программы
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
namespace ConsoleApplication199
{
class Program
{
static void Main(string[] args)
{
//
ClassesCollection.Classes.Add(new Class1());
//
MyClass myClass = new MyClass();
myClass.A();
myClass.B();
Console.ReadLine();
}
}
interface IMyInterface
{
void A();
void B();
void C();
}
static class ClassesCollection
{
public static List<IMyInterface> Classes = new List<IMyInterface>();
}
class MyClass : IMyInterface
{
public void A()
{
OwnMethod();
}
public void B()
{
OwnMethod();
}
public void C()
{
OwnMethod();
}
public void OwnMethod()
{
var stackFrame = new StackTrace().GetFrames()[1];//получаем первый элемент стека вызова
var callingMethodName = stackFrame.GetMethod().Name;//получаем имя метода, котрый нас вызвал
foreach (var cl in ClassesCollection.Classes)
cl.GetType().GetMethod(callingMethodName).Invoke(cl, null);//вызываем этот метод у всех элементов коллекции
}
}
class Class1 : IMyInterface
{
public void A()
{
Console.WriteLine("Hi from Class1.A()");
}
public void B()
{
Console.WriteLine("Hi from Class1.B()");
}
public void C()
{
Console.WriteLine("Hi from Class1.C()");
}
}
}