2

我正在寻找一种在 .NET (Core) 中实现类 Proxy 的方法,并发现框架中实际上有一个名为 DispatchProxy ( source code ) 的实现。当我查看源代码时,它实际上是在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);
        }
4

0 回答 0