больше нет динамичных, неловких размышлений?
-
03-07-2019 - |
Вопрос
В C# 4.0 представлены dynamic
ключевое слово, которое будет искаться во время выполнения.
Означает ли это, что нам больше не понадобятся неловкие размышления?Если да, можете ли вы показать это на примере?
Решение
У нас все еще будет Reflection - использование 'dynamic' для обычных объектов CLR вызовет диспетчер на основе Reflection.
Итак, у нас все еще будет Reflection, но это будет легче сделать.
Вот пример:
// Via 'dynamic'
dynamic dx = GetSomeCLRObject();
dx.DoSomething();
dx.SomeMember = 2;
// Via Reflection
object x = GetSomeCLRObject();
Type xt = x.GetType();
MemberInfo DoSomethingMethod = xt.GetMethod("DoSomething");
DoSomethingMethod.Invoke(x, null);
PropertyInfo SomeMemberProperty = xt.GetProperty("SomeMember");
SomeMemberProperty.SetValue(x, 2);
Я не знаю как вы, но мне нравится первое. =) Р>
В обоих этих случаях я не получаю ни проверки во время компиляции, ни Intellisense, ни поддержки IDE, но первый случай гораздо более выразителен, чем второй.
Другие советы
Динамическая отправка - это только одно возможное использование Reflection. Есть много веских причин для того, чтобы опросить класс на предмет его структуры, получить информацию об этой структуре и визуализировать ее в какой-либо форме или воздействовать на нее каким-либо образом без какого-либо динамического доступа к членам. Отражение здесь, чтобы остаться. :) Р>
Если вам нужны примеры динамического ключевого слова, вот видео с PDC сам человек говорит об этом (и другие вещи C # 4.0 связанные с). р>
Dynamic будет иметь большое значение для решения проблем с методами, известными только по имени, где это имя известно и фиксируется во время компиляции - но, конечно, такие методы также могут быть выражены как интерфейсы, если вы управляете типами.
Бывают случаи, когда dynamic
вообще не поможет:
- где имя метода неизвестно во время компиляции (т.е.он загружается из конфигурации/пользовательского ввода)
- создание объекта
- возможно, некоторые общие сценарии
Самое большое применение, которое я вижу dynamic
являются:
- COM-взаимодействие (очевидно)
- общая поддержка операторов
- дак печатаем там, где нет общего интерфейса
- Взаимодействие с DLR (см. комментарии)
Но это определенно не решает все проблемы с отражением.