예제 #1
0
        public bool TryGetType <T>(ITypeReference reference, out T type)
            where T : IType
        {
            if (reference == null)
            {
                throw new ArgumentNullException(nameof(reference));
            }

            if (reference is ISchemaTypeReference schemaRef &&
                TryGetType(schemaRef, out type))
            {
                return(true);
            }

            if (reference is ISyntaxTypeReference syntaxRef &&
                TryGetType(syntaxRef, out type))
            {
                return(true);
            }

            if (reference is IClrTypeReference clrRef &&
                _typeInitializer.TryNormalizeReference(
                    clrRef, out ITypeReference normalized) &&
                _typeInitializer.Types.TryGetValue(
                    normalized, out RegisteredType registered) &&
                registered.Type is IType t &&
                _typeInitializer.TypeInspector.TryCreate(
                    clrRef.Type, out TypeInfo typeInfo) &&
                typeInfo.TypeFactory.Invoke(t) is T casted)
            {
                type = casted;
                return(true);
            }

            type = default;
            return(false);
        }
예제 #2
0
        public bool TryGetType <T>(ITypeReference reference, out T type)
            where T : IType
        {
            if (reference == null)
            {
                throw new ArgumentNullException(nameof(reference));
            }

            if (_typeInitializer.TryNormalizeReference(
                    reference, out ITypeReference nr) &&
                _typeInitializer.Types.TryGetValue(
                    nr, out RegisteredType rt) &&
                rt.Type is IType t)
            {
                IType resolved;
                if (reference is IClrTypeReference cr &&
                    _typeInitializer.TypeInspector.TryCreate(
                        cr.Type, out TypeInfo typeInfo))
                {
                    resolved = typeInfo.TypeFactory.Invoke(t);
                }
                else if (reference is ISyntaxTypeReference sr)
                {
                    resolved = WrapType(t, sr.Type);
                }
                else
                {
                    resolved = t;
                }

                if (resolved is T casted)
                {
                    type = casted;
                    return(true);
                }
            }
예제 #3
0
        public bool TryGetType <T>(ITypeReference reference, out T type)
            where T : IType
        {
            if (reference == null)
            {
                throw new ArgumentNullException(nameof(reference));
            }

            if (reference is SchemaTypeReference schemaRef &&
                TryGetType(schemaRef, out type))
            {
                return(true);
            }

            if (reference is SyntaxTypeReference syntaxRef &&
                TryGetType(syntaxRef, out type))
            {
                return(true);
            }

            if (reference is ClrTypeReference clrRef &&
                _typeInitializer.TryNormalizeReference(
                    clrRef, out ITypeReference normalized) &&
                _typeInitializer.DiscoveredTypes is { } &&