c# - .NET DispatchProxy 如何工作/实现?
问题描述
我正在寻找一种在 .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);
}
解决方案
推荐阅读
- android - 屏幕旋转后如何保留片段的列表视图内容?
- javascript - TypeError: object null is not iterable (cannot read property Symbol(Symbol.iterator))
- linux - 如何摆脱:第 1 行:/backup: 是目录,错误消息?
- django - 如何在 DRF 中实现会话空闲超时
- python - 如何在 Jupyter notebook 中找到特定的代码行?
- drake - 直接搭配时:InputPort::Eval(): required InputPort[0] (geometry_query)
- python - python web scraper中的错误无法正常运行
- javascript - My Balance States Throws Balance.map 不是函数错误?
- react-native - 如何获取图像链接作为输入并使其显示在下面的视图组件中?
- reactjs - 如何使用 react-big-calendar onRangeChange 选项