Головоломка с архитектурой приложения - 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()"); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д