Как .NET DispatchProxy работает / реализован? - PullRequest
0 голосов
/ 20 марта 2019

Я искал способ реализации класса Proxy в .NET (Core) и обнаружил, что на самом деле в фреймворке есть реализация DispatchProxy ( исходный код ). Когда я посмотрел на исходный код, он фактически реализован здесь на DispatchProxyGenerator .

Мне интересно знать, как это реализовано. Однако я зашел в тупик, так как мои знания ограничены. Я не могу понять, как это работает. Может ли кто-нибудь просветить меня?

Мое лучшее предположение из кода: попытаться создать во время выполнения элементы типа, использующие System.Reflection, и испустит некоторый код IL, это правильно? Предположим, я хочу создать очень простую реализацию DispatchProxy. Могу ли я просто использовать что-то вроде DynamicObject и вернуть вместо него делегат?

        private void Complete()
        {
            Type[] args = new Type[_fields.Count];
            for (int i = 0; i < args.Length; i++)
            {
                args[i] = _fields[i].FieldType;
            }

            ConstructorBuilder cb = _tb.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, args);
            ILGenerator il = cb.GetILGenerator();

            // chained ctor call
            ConstructorInfo baseCtor = _proxyBaseType.GetTypeInfo().DeclaredConstructors.SingleOrDefault(c => c.IsPublic && c.GetParameters().Length == 0);
            Debug.Assert(baseCtor != null);

            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Call, baseCtor);

            // store all the fields
            for (int i = 0; i < args.Length; i++)
            {
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldarg, i + 1);
                il.Emit(OpCodes.Stfld, _fields[i]);
            }

            il.Emit(OpCodes.Ret);
        }
...