我正在寻找一种在 .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);
}