Форум: "Прочее";
Текущий архив: 2014.11.16;
Скачать: [xml.tar.bz2];
ВнизС# и проверка абстрактных методов Найти похожие ветки
← →
KSergey © (2014-03-30 13:23) [0]Что хочется сделать:
Пусть есть некий класс, в нём 100 абстрактных методов.
Часть этих методов (именно часть!) будет перекрыта в потомке.
И перекрытые (только перекрытые в потомке методы) будут вызываться на некие события.
Те события, для которых абстрактные методы фактически не реализованы, не должны приводить к вызову соответствующих методов.
Понятно, что можно сделать в базовом классе 100 виртуальных методов и синтаксически проблема как бы отпадёт сама собой. Но беда в том, что вызвать метод из события - весьма затратная процедура (затратна подготовка аргументов). Кроме того предполагается, что из 100 доступных методов (т.е. соответсвующим 100 различным событиям) в конкретной реализации будут нужны (реализованы) только 5...10.
События отменить нельзя, они все 100 будут возникать. Вот и хотелось бы сэкономить и не делать формирование аргументов для тех методов, фактическая реализация которых - отсутствует.
Про абстрактные - это я привёл для примера, фактически использовать их - не получается, т.к. для создания экземпляра надо фактически определить все их.
Вопрос: подскажите, какой бы механизм поиспользовать, при котором можно было бы
- фактически определять не все потенциально доступные методы предка
- быстро и дешево определять есть ли в потомке фактическая реализация того или иного метода, или нет.
← →
clickmaker © (2014-03-30 14:13) [1]как вариант
var assembly = Assembly.GetExecutingAssembly();
var type = assembly.GetType("MyClass");
var method = type.GetMethod("MyMethod");
if (method != null) {
method.Invoke();
}
← →
clickmaker © (2014-03-30 16:16) [2]только непонятно, как ты скомпилишь класс, который не реализует абстрактные методы своего предка...
← →
картман © (2014-03-30 16:50) [3]
> Вопрос: подскажите, какой бы механизм поиспользовать, при
> котором можно было бы
> - фактически определять не все потенциально доступные методы
> предка
> - быстро и дешево определять есть ли в потомке фактическая
> реализация того или иного метода, или нет.
TChild
fImplementList
но, кажется, это моветон - слишком просто
← →
clickmaker © (2014-03-30 19:10) [4]вдогонку к [1]
var method = type.GetMethod("MyMethod", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly);
найдет только если в MyClass MyMethod - override
← →
KSergey © (2014-03-31 09:29) [5]> clickmaker © (30.03.14 16:16) [2]
> только непонятно, как ты скомпилишь класс, который не реализует
> абстрактные методы своего предка...
Да, в этом проблема в том числе )
Про абстрактный предок - я так, чего знаю - то и написал. Видимо правильно было говорить про интерфейс, часть методов которого инплементирована.
> clickmaker © (30.03.14 19:10) [4]
> найдет только если в MyClass MyMethod - override
Вероятно то, что надо (ну если в базовом классе не абстрактные
методы описать, а просто пустышки виртуальные)
> картман © (30.03.14 16:50) [3]
> TChild
> fImplementList
Тоже попробую, спасибо.
← →
clickmaker © (2014-03-31 10:02) [6]> Видимо правильно было говорить про интерфейс, часть методов
> которого инплементирована.
в данном случае это то же самое. Класс обязан реализовать методы интерфейса хотя бы в виде заглушек
← →
KSergey © (2014-03-31 10:15) [7]Блин! что же делать, шеф, что же делать??
← →
clickmaker © (2014-03-31 10:24) [8]> [7] KSergey © (31.03.14 10:15)
см. [4]public class MyClassBase
{
public virtual void Method1() {}
public virtual void Method2() {}
}
public class MyClass: MyClassBase
{
public override void Method1() {}
}
var type = assembly.GetType("MyClass");
var method = type.GetMethod("Method1", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly);
//method != null
var method = type.GetMethod("Method2",...);
//method == null
← →
KSergey © (2014-03-31 15:16) [9]понял, большое спасибо!!
осталось ежа с ужом скрестить
← →
ухты (2014-04-02 15:01) [10]похоже что с архитектурой швах
← →
KSergey © (2014-04-03 14:57) [11]Расскажите, как сделать не швах.
← →
Styx (2014-04-03 15:17) [12]
> KSergey © (03.04.14 14:57) [11]
> Расскажите, как сделать не швах.
Для этого нужно по крайней мере понять, чего хочется добиться. Иначе, как обычно, XYZ.
← →
ТНЕ картман (2014-04-03 15:52) [13]
> понять, чего хочется добиться
это самое простое: поддержка системы, начавшей создаваться 15 лет назад международным коллективом студентов(с ротацией сотрудников 50%/полгода), понятия не имевших, что в итоге должно получиться.
← →
_oxffff (2014-04-03 21:49) [14]
> KSergey © (03.04.14 14:57) [11]
> Расскажите, как сделать не швах.
>
>
:)
← →
ухты (2014-04-04 10:25) [15]что-бы что-то продать ненужное надо купить ненужное а у нас денег нет..
вощем, как автор и говорит, тут кроме метра колючей проволоки ничего хорошего не выйдет, посему
> Styx (03.04.14 15:17) [12]
+1
← →
jack128_ (2014-04-04 12:38) [16]
> Но беда в том, что вызвать метод из события - весьма затратная
> процедура (затратна подготовка аргументов)
Почему бы не передавать в эти обработчики Lazy<T> ?
← →
KSergey © (2014-04-07 15:05) [17]> Styx (03.04.14 15:17) [12]
> Для этого нужно по крайней мере понять, чего хочется добиться.
Что именно вам не понятно в [0]? Предметно.
← →
KSergey © (2014-04-07 15:11) [18]> jack128_ (04.04.14 12:38) [16]
> Почему бы не передавать в эти обработчики Lazy<T> ?
Я не знаю что это такое, но врятли в обработчики что-то можно передать.
Система простая: есть unmanaged приложение, которое умеет подгружать DLL-ки и дергать в них функции.
Хочется научиться эти DLL-ки делать на C#. Само по себе подъёмно, но хотелось бы эффективности именно в указанной части -- подготовке аргументов. Т.к. возможных функций штук 40, почти в каждую заезжает структура на пару...тройку десятков параметров грубо говоря.
Все функции реализовывать - смысла нет. Но и - на сколько я понимаю - в C# нарисовать "частично реализованный объект" возможности нет. Вот и хотелось бы тут заэкономить.
← →
картман © (2014-04-07 15:47) [19]
> KSergey © (07.04.14 15:11) [18]
>
> > jack128_ (04.04.14 12:38) [16]
> > Почему бы не передавать в эти обработчики Lazy<T> ?
>
> Я не знаю что это такое
http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F
← →
Styx (2014-04-07 19:35) [20]
> KSergey © (07.04.14 15:05) [17]
> > Styx (03.04.14 15:17) [12]
> > Для этого нужно по крайней мере понять, чего хочется добиться.
>
>
> Что именно вам не понятно в [0]? Предметно.
Непонятен X. Изложенное в [0] - это уже Y.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2014.11.16;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.002 c