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