示例#1
0
 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;
     }
 }
示例#2
0
        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;
            }
        }