Exemplo n.º 1
0
        private static void AssertOptimized(GenericTypeSlim type, int arity, params TypeSlim[] args)
        {
            Assert.IsTrue(type.GetType().Name.EndsWith(arity.ToString()));

            Assert.AreEqual(arity, type.GenericArgumentCount);

            for (var i = 0; i < args.Length; i++)
            {
                Assert.AreSame(args[i], type.GetGenericArgument(i));
            }

            var genArgs = type.GenericArguments;

            Assert.AreSame(genArgs, type.GenericArguments);

            Assert.AreEqual(arity, genArgs.Count);

            for (var i = 0; i < args.Length; i++)
            {
                Assert.AreSame(args[i], genArgs[i]);
            }

            Assert.ThrowsException <ArgumentOutOfRangeException>(() => type.GetGenericArgument(-1));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => type.GetGenericArgument(arity));
        }
            protected override System.Type MakeGeneric(GenericTypeSlim type, System.Type typeDefinition, ReadOnlyCollection <System.Type> arguments)
            {
                var res = default(System.Type);

                if (typeDefinition != null && arguments.All(a => a != null))
                {
                    res = typeDefinition.MakeGenericType(arguments.ToArray());
                }

                return(res);
            }
Exemplo n.º 3
0
        private TypeRef AddTypeGeneric(GenericTypeSlim type, ReadOnlyCollection <TypeSlim> genericArguments)
        {
            var genericTypeDefinition = AddType(type.GenericTypeDefinition, genericArguments);

            var genericTypeArgumentCount = type.GenericArgumentCount;
            var genericTypeArguments     = new TypeRef[genericTypeArgumentCount];

            for (var i = 0; i < genericTypeArgumentCount; i++)
            {
                var argType = type.GetGenericArgument(i);
                var typeRef = AddType(argType, genericArguments);
                genericTypeArguments[i] = typeRef;
            }

            var index = _typeDefs.Count;

            _typeDefs.Add(new GenericTypeDef(genericTypeDefinition, genericTypeArguments));
            return(new SimpleTypeRef(index));
        }
Exemplo n.º 4
0
        /// <summary>
        /// Unifies generic types with awareness of the conversion from asynchronous to synchronous Reactive entity types.
        /// </summary>
        /// <param name="typeRich">The CLR type.</param>
        /// <param name="typeSlim">The slim type.</param>
        /// <returns>true if the unification was successful, false otherwise.</returns>
        protected override bool UnifyGeneric(Type typeRich, GenericTypeSlim typeSlim)
        {
            var reactiveType = ReactiveEntityTypeExtensions.FromTypeSlim(typeSlim);

            if ((reactiveType & ReactiveEntityType.Func) == ReactiveEntityType.Func)
            {
                reactiveType = ReactiveEntityType.Func;
            }

            return(reactiveType switch
            {
                ReactiveEntityType.Func => Unify(typeRich.GetGenericArguments(), typeSlim),

                ReactiveEntityType.Observer or
                ReactiveEntityType.Observable or
                ReactiveEntityType.StreamFactory or
                ReactiveEntityType.SubscriptionFactory or
                ReactiveEntityType.Stream => Unify(GetEntityTypes(typeRich, reactiveType), typeSlim),

                _ => base.UnifyGeneric(typeRich, typeSlim),
            });