public void SetupParameters(MethodBuilder methodBuilder, GenericParameterMapper parentMapper) { if (this._methodToOverride.IsGenericMethod) { Type[] genericArguments = this._methodToOverride.GetGenericArguments(); string[] names = (from t in genericArguments select t.Name).ToArray(); GenericTypeParameterBuilder[] builders = methodBuilder.DefineGenericParameters(names); for (int i = 0; i < genericArguments.Length; i++) { builders[i].SetGenericParameterAttributes(genericArguments[i].GenericParameterAttributes); Type[] source = (from ct in genericArguments[i].GetGenericParameterConstraints() select parentMapper.Map(ct)).ToArray(); Type[] interfaceConstraints = (from t in source where t.IsInterface select t).ToArray(); Type baseConstraint = (from t in source where !t.IsInterface select t).FirstOrDefault(); if (baseConstraint != (Type)null) { builders[i].SetBaseTypeConstraint(baseConstraint); } if (interfaceConstraints.Length != 0) { builders[i].SetInterfaceConstraints(interfaceConstraints); } } this._genericParameterMapper = new GenericParameterMapper(genericArguments, builders.Cast <Type>().ToArray(), parentMapper); } else { this._genericParameterMapper = parentMapper; } }
private void CreateTypeBuilder() { TypeAttributes newAttributes = _typeToIntercept.Attributes; newAttributes = FilterTypeAttributes(newAttributes); Type baseClass = GetGenericType(_typeToIntercept); ModuleBuilder moduleBuilder = GetModuleBuilder(); _typeBuilder = moduleBuilder.DefineType($"DynamicModule.Wrapped_{_typeToIntercept.Name}_{Guid.NewGuid().ToString("N")}", newAttributes, baseClass); _mainTypeMapper = DefineGenericArguments(_typeBuilder, baseClass); if (_typeToIntercept.IsGenericType) { Type definition = _typeToIntercept.GetGenericTypeDefinition(); Type[] mappedParameters = (from t in definition.GetGenericArguments() select _mainTypeMapper.Map(t)).ToArray(); _targetType = definition.MakeGenericType(mappedParameters); } else { _targetType = _typeToIntercept; } }