Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }