Огляд статей про рефлексії:
Про огляд EMIT:
Спочатку створіть простий об'єкт, створіть його і використайте emit та expression для читання та зміни значення об'єкта, і ви побачите, що результат виконання відповідає очікуванням, як показано на рисунку нижче:
Бенчмарк із використанням BenchmarkDotNet для бенчмаркінгу, читання лише значення об'єктів для тестування, працює на Net472 та NetCoreApp31, результати тесту такі:
Зведення:
І emit, і expression ефективніші, ніж використання рефлексії для отримання значень, і в фреймворку .NET 4.7.2 емістрація краща за ефективність виконання виразів, але в фреймворку .NET Core 3.1 вираз кращий за виконання emit.
Якщо вашій програмі потрібно динамічно виконати об'єкт лише один раз, рекомендується використовувати reflection (адже немає потреби інкапсулювати знову або створювати делегат), а якщо програмі потрібно динамічно виконувати об'єкт кілька разів, рекомендується використовувати emit або expression, і, звичайно, потрібна додаткова інкапсуляція.
Тестовий код виглядає так:
При використанні Expression для отримання значень об'єктів помилка буде подана наступним чином:
Вираз типу 'System.Int32' не може використовуватися для повернення типу 'System.Object' Я справді не знаю, як ці люди ним користуються, вони лише вміють копіювати і вставляти!
|