Я искал способ реализации класса 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);
}