с динамичным, неловким отражением больше нет? - PullRequest
3 голосов
/ 03 мая 2009

C # 4.0 вводит ключевое слово dynamic, которое будет искать во время выполнения.

Значит ли это, что нам больше не понадобится неловкое отражение? Если да, можете ли вы показать пример этого?

Ответы [ 3 ]

6 голосов
/ 03 мая 2009

У нас все еще будет 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, но первый случай гораздо более выразителен, чем второй.

4 голосов
/ 03 мая 2009

Динамическая отправка - это только одно из возможных применений Reflection. Есть много веских причин для того, чтобы опросить класс на предмет его структуры, получить информацию об этой структуре и визуализировать ее в какой-либо форме или воздействовать на нее каким-либо образом без какого-либо динамического доступа к членам. Отражение здесь, чтобы остаться. :)

Если вам нужны примеры динамического ключевого слова, вот видео с PDC из самого человека , рассказывающего об этом (и другие вещи, связанные с C # 4.0).

1 голос
/ 03 мая 2009

Dynamic будет иметь большое значение для решения проблем методами, известными только по имени, где это имя известно и исправлено во время компиляции, но, конечно, такие методы также могут быть выражены как интерфейсы, если вы управляете типами.

Есть случаи, когда dynamic не поможет вообще:

  • где имя метода неизвестно во время компиляции (т. Е. Оно загружается из config / user input)
  • создание объекта
  • может быть, некоторые сценарии генериков

Наибольшее использование, которое я вижу для dynamic, это:

  • COM-взаимодействие (очевидно)
  • универсальная поддержка оператора
  • утка, набирающая, где нет общего интерфейса
  • DLR interop (см. Комментарии)

Но это определенно не решает всех проблем.

...