При вызове статического метода для родительского класса может ли родительский класс определить тип для дочернего класса (C #)? - PullRequest
1 голос
/ 25 мая 2010

Предположим, у нас есть 2 класса Child и класс, от которого он наследуется, Parent.

class Parent
{
    public static void MyFunction(){}
}

class Child : Parent
{
}

Можно ли определить в родительском классе, как был вызван метод? Потому что мы можем назвать это двумя способами:

Parent.MyFunction();
Child.MyFunction();

Мой текущий подход пытался использовать:

MethodInfo.GetCurrentMethod().ReflectedType; // and
MethodInfo.GetCurrentMethod().DeclaringType;

Но оба, похоже, возвращают тип Parent.

Если вам интересно, что именно я пытаюсь выполнить (и почему я нарушаю основное правило ООП, согласно которому родитель не должен ничего знать о ребенке), если коротко, то это (дайте мне знать если вы хотите длинную версию):

У меня есть структура Model, представляющая некоторые из наших данных, которые сохраняются в базе данных. Все эти модели наследуются от абстрактного Parent. Этот родительский объект реализует пару событий, таких как SaveEvent, DeleteEvent и т. Д. Мы хотим иметь возможность подписаться на события, относящиеся к типу. Итак, хотя событие находится в родительском, я хочу иметь возможность сделать:

Child.SaveEvent += new EventHandler((sender, args) => {});

У меня есть все на месте, где событие фактически поддерживается словарем обработчиков событий, хэшированным по типу. Последнее, что мне нужно для работы, - это правильное определение типа Child при выполнении Child.SaveEvent.

Я знаю, что могу реализовать событие в каждом дочернем классе (даже форсировать его с помощью абстрактного), но было бы неплохо сохранить все это в родительском классе, который является классом, на самом деле запускающим события (поскольку он реализует общие функции сохранения / удаления / изменения).

Ответы [ 4 ]

5 голосов
/ 25 мая 2010

Нет - вызов Child.MyFunction() приводит к IL, который вызывает Parent.MyFunction() напрямую. Полученный двоичный файл в основном неразличим.

0 голосов
/ 25 мая 2010

Я вообще не знаю кода, но я сомневаюсь в целесообразности использования статических методов в этом случае. Возможно, вам нужен отдельный класс «Менеджер», который представляет собой одноэлементный объект, который используется для обработки событий, а также для других задач координации для всех объектов модели.

0 голосов
/ 25 мая 2010

Я не думаю, что это возможно, по той простой причине, что Child.SaveEvent на самом деле не существует . SaveEvent объявляется только в Parent, хотя компилятор позволяет вызывать его как Child.SaveEvent.

Чтобы делать то, что вам нужно, вам не следует использовать статический метод. Вы можете легко определить нестатический SaveEvent, который будет вести себя точно так, как нужно. Если вам действительно нужна статическая оболочка, вы можете использовать синглтон.

0 голосов
/ 25 мая 2010

Последнее, что мне нужно для работы - это правильное определение типа Child при выполнении Child.SaveEvent.

Вы можете использовать базовый базовый класс или сделать метод универсальным.

...