Используя IL можно выполнять CLR-команды https://en.wikipedia.org/wiki/List_of_CIL_instructions в любом порядке, каком захочется. Можно даже нарушать safe-концепцию и т п. не запрещено. Рефлексия сама по-себе позволяет получить доступ и к приватным и к другим членам класса. А IL - это язык команд. Можно создать как хорошо-оптимизированый IL-код, так и код который поломает приложение.
Но что важно, что IL-код не может существовать "сам по себе", он оформляется как сборка. Это свойство используется для генерации Entity, например. Код вида
foreach (PropertyInfo prop in obj.Props)
do_something
На IL можно через цикл реализовать можно так (условно) https://subscribe.ru/archive/comp.soft.prog.csharplessons/200703/21001224.html/
ldarg.1
getprop a
do_something
ldarg.1
getprop b
do_something
Но нужно понимать, что для даного il (который генерируете не вы, а ваш автомат)
foreach (PropertyInfo prop in obj.Props) {
il.Emit(OpCodes.ldarg1);
//....
}
нужно создать сборку, если используется динамический assembly - то будет создана временная сборка (темповый файл с dll).
О быстродействии, компиляция IL занимает время (если использовать динамическое формирование IL кода), если механизм будет использован 1 раз - ускорения не будет. Если у вас миллион вызовов по свойствам (такое часто в СУБД) - то лучше создать сборку. Потому что для доступа через привычную рефлексию (foreach, Properties, SetValue) используется в 10-20 раз больше IL-команд чем просто через IL (три команды ldarg,ldarg,setprop плюс минус). Есть либы, которое это делают автоматом.
Вообщем IL позволяет делать самомодифицирующийся(условно) код, или компилировать код неприбегая к "csc.exe".
Если цель - получить доступ к приватному свойству - то оно чаще всего доступно просто через рефлексию.
FieldInfo. А вот в IL-коде прямой доступ, такой же, как и на C# в случае, когда тип известен заранее. – VladD Nov 19 '18 at 17:57