private void MapConstructor(GenericReferenceExpression node, GenericMappedConstructor member) { var source = member.SourceMember; var genArgs = node.GenericArguments .Select(ga => _methodToStateMachineMapper.MapType((IType)ga.Entity)) .ToArray(); var result = source.DeclaringType.GenericInfo.ConstructType(genArgs).ConstructedInfo.Map(source); node.Entity = result; node.ExpressionType = result.Type; }
/// <summary> /// Maps a type member involving generic arguments to its constructed counterpart, after substituting /// concrete types for generic arguments. /// </summary> public IEntity Map(IEntity source) { if (source == null) return null; // Map generic source to the constructed owner of this mapping if (source == _genericSource) { return _constructedOwner; } // Use cache if possible if (_cache.ContainsKey(source)) { return _cache[source]; } // Map entity based on its entity type IEntity mapped = null; switch (source.EntityType) { case EntityType.Ambiguous: mapped = MapAmbiguousEntity((Ambiguous)source); break; case EntityType.Method: mapped = new GenericMappedMethod(_tss, ((IMethod)source), this); break; case EntityType.Constructor: mapped = new GenericMappedConstructor(_tss, ((IConstructor)source), this); break; case EntityType.Field: mapped = new GenericMappedField(_tss, ((IField)source), this); break; case EntityType.Property: mapped = new GenericMappedProperty(_tss, ((IProperty)source), this); break; case EntityType.Event: mapped = new GenericMappedEvent(_tss, ((IEvent)source), this); break; case EntityType.Parameter: mapped = new GenericMappedParameter((IParameter)source, this); break; case EntityType.Array: case EntityType.Type: mapped = MapType((IType)source); break; default: return source; } // Cache mapped result and return it _cache[source] = mapped; return mapped; }