Могу ли я использовать OpCodes.Ldsfld без использования FieldInfo?

Я хочу избежать использования GetType и GetField. Могу ли я просто использовать строку с Ldsfld? Я включил макет того, что я пытаюсь сделать ниже. Как видите, я новичок в IL Generation — я пытаюсь убрать часть затрат на отражение в своем приложении.

using System;
using System.Reflection.Emit;

namespace ConsoleApplication10
{
    static class Program
    {
        public static string TextBox1 = "Hello World!";

        static void Main(string[] args)
        {
            var dm = new DynamicMethod("My_method",
                typeof(string), null, true);

            var il = dm.GetILGenerator();
            il.Emit(OpCodes.Ldsfld, "string ConsoleApplication10.Program::TextBox1");
            il.Emit(OpCodes.Ret);
            var func = (Func<string>)dm.CreateDelegate(typeof(Func<string>));
            var s = func();

            Console.WriteLine(s);
        }
    }
}

person metafood    schedule 21.03.2016    source источник
comment
Вы должны использовать отражение для правильного создания IL. Дело в том, что вы делаете это только один раз, DynamicMethod можно использовать сколько угодно раз и не использует отражение.   -  person Hans Passant    schedule 22.03.2016
comment
Спасибо. В моем приложении у меня есть дочерний процесс, который запускается много раз, и при каждом запуске процесса я несу затраты на отражение. Я рассмотрю другие способы удаления/оптимизации использования отражения.   -  person metafood    schedule 22.03.2016
comment
В этом слишком мало смысла, запуск процесса обходится на порядки дороже, чем рефлексия. Не думайте о проблеме производительности, вы ошибетесь.   -  person Hans Passant    schedule 22.03.2016
comment
Также обратите внимание, что ILGenerator почти никогда не требуется. Гораздо проще генерировать код, используя деревья выражений. Вероятно, вы использовали устаревший учебник (5 лет назад).   -  person usr    schedule 22.03.2016
comment
Да, стоимость отражения в моем приложении значительно меньше стоимости запуска процессов. Я проводил измерения, используя класс секундомера, и определил, что по большому счету мое использование рефлексии стоит того, чтобы тратить время, поскольку я могу использовать объединение процессов и сократить время запуска процесса.   -  person metafood    schedule 22.03.2016


Ответы (1)