private dynamic ParseCollection(Type t, STEPParser.CollectionContext value) { // Ex: #25 = IFCDIRECTION((1., 0., 0.)); // IfcDirection takes a List<double> as its input parameters, so we get the type argument - double - and // do the coercion for all the items. // Ex: #31 = IFCSITE('3BoQ8L5UXBEOT1kW0PLzej', #2, 'Default Site', 'Description of Default Site', $, #32, $, $, .ELEMENT., (24, 28, 0), (54, 25, 0), 10., $, $); // IfcSite takes two IfcCompoundPlaneMeasure objects. It seems that some IFC exporters will not specify a type's constructor, they'll just // specify the arguments as a collection. Type collectionType; System.Reflection.ConstructorInfo ctor = null; var ctorChain = new List <System.Reflection.ConstructorInfo>(); if (t.IsGenericType) { collectionType = t.GetGenericArguments()[0]; } else { ctor = GetConstructorForType(t, ref ctorChain); collectionType = ctor.GetParameters()[0].ParameterType.GetGenericArguments()[0]; } var result = new List <object>(); foreach (var cv in value.collectionValue()) { if (cv.Id() != null) { result.Add(ParseId(cv.Id().GetText())); } else if (cv.AnyString() != null) { result.Add(ParseString(collectionType, cv.AnyString().GetText())); } else if (cv.StringLiteral() != null) { result.Add(ParseString(collectionType, cv.StringLiteral().GetText())); } else if (cv.IntegerLiteral() != null) { result.Add(ParseInt(collectionType, cv.IntegerLiteral().GetText())); } else if (cv.RealLiteral() != null) { result.Add(ParseReal(collectionType, cv.RealLiteral().GetText())); } else if (cv.constructor() != null) { result.Add(ParseConstructor(currId, cv.constructor())); } } if (ctor != null) { return(new InstanceData(-1, t, new List <object>() { result }, ctor, ctorChain)); } return(result); }
/// <summary> /// Exit a parse tree produced by <see cref="STEPParser.collection"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitCollection([NotNull] STEPParser.CollectionContext context) { }