DmdType CreateTypeSig(IList <TSpec> tspecs, DmdType currentType) { foreach (var tspec in tspecs) { switch (tspec.etype) { case DMD.ElementType.SZArray: currentType = currentType.MakeArrayType(); break; case DMD.ElementType.Array: var arraySpec = (ArraySpec)tspec; currentType = currentType.MakeArrayType(arraySpec.rank, arraySpec.sizes, arraySpec.lowerBounds); break; case DMD.ElementType.GenericInst: var ginstSpec = (GenericInstSpec)tspec; currentType = currentType.MakeGenericType(ginstSpec.args.ToArray()); break; case DMD.ElementType.ByRef: currentType = currentType.MakeByRefType(); break; case DMD.ElementType.Ptr: currentType = currentType.MakePointerType(); break; default: Verify(false, "Unknown TSpec"); break; } } return(currentType); }
static DmdConstructorInfo GetConstructor(DmdType proxyType, DmdType targetType) { if ((object)proxyType == null) { return(null); } if (proxyType.IsConstructedGenericType) { return(null); } var proxyTypeGenericArgs = proxyType.GetGenericArguments(); var targetTypeGenericArgs = targetType.GetGenericArguments(); if (proxyTypeGenericArgs.Count != targetTypeGenericArgs.Count) { return(null); } if (targetTypeGenericArgs.Count != 0) { proxyType = proxyType.MakeGenericType(targetTypeGenericArgs); } var ctors = proxyType.GetConstructors(DmdBindingFlags.Public | DmdBindingFlags.NonPublic | DmdBindingFlags.Instance); foreach (var ctor in ctors) { var types = ctor.GetMethodSignature().GetParameterTypes(); if (types.Count != 1) { continue; } if (!types[0].IsAssignableFrom(targetType)) { continue; } return(ctor); } return(null); }