Преимущества DynamicMethod.TryInvokeMember () перед использованием словарей в качестве аргументов? - PullRequest
3 голосов
/ 25 августа 2011

Каковы преимущества в C # 4.0 (помимо синтаксиса) использования

DynamicObject.TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 

по сравнению с простым вызовом нединамического метода с этой сигнатурой:

public object MethodParser(string methodName, Dictionary<string, object> arguments) 

, где methodName - этоимя аргумента «method» - это словарь имени аргумента и значения аргумента (MethodParser - просто произвольное имя)

Другими словами, вызов

foo.NonExistentMethod(arg1:"a1", arg2:3.14m)

over

foo.MethodParser("NonExistentMethod", new Dictionary<string, object>(){{"arg1", "a1"}, {"arg2": 3.14m}})

Ответы [ 3 ]

4 голосов
/ 30 августа 2011

Преимущества динамических методов заключаются в том, что они могут обеспечить взаимодействие с динамическими языками, особенно теми, которые предоставляются DLR, IronPython и IronRuby.Второй предложенный вами метод не обеспечивает какой-либо совместимости.

Еще одно огромное преимущество читабельности.Кто-то, рассматривающий и обслуживающий код, может прочитать и понять вызов динамического метода намного проще, чем вызов на основе словаря.

4 голосов
/ 30 августа 2011

У вас больше возможностей легко выполнять настройку без рефакторинга за пределами DynamicObject. Например, если во время профилирования вы обнаружите, что конкретный динамический вызов метода для этого объекта является горячей точкой, вы можете просто статически добавить этот конкретный метод в свой DynamicObject, а не только получить динамический вызов без поиска строки (после первого call), но затем вы можете оптимизировать свою конкретную реализацию отдельно от остального динамического кода.

Или вы можете просто написать более оптимизированный IDynamicMetaObjectProvider для всего вашего динамического кода, а не использовать DynamicObject (как это сделала Microsoft для ExpandoObject), и тогда не нужно будет полагаться на поиск строк для каждого последующего вызова, такого как MethodParser и TryInvokeMember будет

Если имя члена на самом деле не важно, из примера трудно сказать, что вы могли бы просто статически объявить методы получения свойств, которые возвращают динамический объект с помощью DynamicObject, используя DynamicObject.TryInvoke, а затем вы получите некоторое автозаполнение для части имени и все еще может иметь динамические имена аргументов.

Но, очевидно, главное преимущество, которое мы должны сбрасывать со счетов, заключается в том, что MethodParser гораздо менее читабелен.

3 голосов
/ 03 сентября 2011

Это большой вопрос. Вот несколько мыслей по этому поводу.

Преимущества

1) VS может обеспечить интеллигентность для ранее использованных динамических элементов, что является лучшим вариантом для IDE.

2) Он более согласуется с другим кодом, что облегчает его чтение и понимание.

3) Он может работать лучше, потому что это слой поверх Reflection, и поэтому может кэшировать делегатов, тем самым вызывая Reflection только один раз для члена.

4) Он совместим с такими технологиями, как COM, что не соответствует действительности при использовании Reflection и устраняет необходимость явного приведения типов между вызовами.

5) Обеспечивает более слабую связь, чем с Reflection. Возможно переназначить внутренние элементы, не влияя на код, который его потребляет.

6) Можно виртуализировать экземпляр. Вызванные участники фактически не должны существовать. Реализация полностью расширяема и позволяет создавать прокси / фасады, которые скрывают реализации от вызывающей стороны.

Недостатки

1) Легко используется в сценариях, где проверка типа неоправданно теряется. Это так же просто, как набрать ключевое слово против понимания и написать код около Reflection.

2) Используя красивый синтаксис, невозможно защитить от магических строк.

Я уверен, что больше всего хотелось бы поделиться некоторыми моментами, которые не были подняты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...