Exemplo n.º 1
0
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var genericType       = Type.GetType(TypeName);
            var typeArgumentArray = new Type[TypeArguments.Count];

            TypeArguments.CopyTo(typeArgumentArray, 0);
            var concreteType = genericType.MakeGenericType(typeArgumentArray);

            return(concreteType);
        }
Exemplo n.º 2
0
        /// <summary>
        /// ProvideValue, which returns the concrete object of the generic type</summary>
        /// <param name="serviceProvider">The service provider</param>
        /// <returns>The instance of the type</returns>
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            string[] baseTypeArray = _typeName.Split(':');

            var namespaceResolver =
                serviceProvider.GetService(typeof(IXamlTypeResolver)) as System.Xaml.IXamlNamespaceResolver;

            if (namespaceResolver == null)
            {
                throw new Exception("The Generic markup extension requires an IXamlNamespaceResolver service provider");
            }

            var schemaContextProvider =
                serviceProvider.GetService(typeof(System.Xaml.IXamlSchemaContextProvider)) as System.Xaml.IXamlSchemaContextProvider;

            if (schemaContextProvider == null)
            {
                throw new Exception("The Generic markup extension requires an IXamlSchemaContextProvider service provider");
            }

            var    xamlNamespace = namespaceResolver.GetNamespace(baseTypeArray[0]);
            string name          = baseTypeArray[1] + "`" + TypeArguments.Count.ToString();
            var    xamlTypeName  = new System.Xaml.Schema.XamlTypeName(xamlNamespace, name);
            var    xamlType      = schemaContextProvider.SchemaContext.GetXamlType(xamlTypeName);

            if (xamlType == null)
            {
                throw new Exception("The type could not be resolved");
            }

            Type genericType = xamlType.UnderlyingType;

            // Get an array of the type arguments
            Type[] typeArgumentArray = new Type[TypeArguments.Count];
            TypeArguments.CopyTo(typeArgumentArray, 0);

            // Create the concrete type, e.g. Collection<String>
            var concreteType = genericType.MakeGenericType(typeArgumentArray);

            // Create an instance of that type
            return(Activator.CreateInstance(concreteType));
        }
Exemplo n.º 3
0
        // ProvideValue, which returns the concrete object of the generic type
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var xamlTypeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;

            if (xamlTypeResolver == null)
            {
                throw new ArgumentException("xamlTypeResolver");
            }

            // Get e.g. "Collection`1" type
            var genericType = xamlTypeResolver.Resolve(string.Format("{0}`{1}", TypeName, TypeArguments.Count));

            // Get an array of the type arguments
            var typeArgumentArray = new Type[TypeArguments.Count];

            TypeArguments.CopyTo(typeArgumentArray, 0);

            // Create the conrete type, e.g. Collection<String>
            var concreteType = genericType.MakeGenericType(typeArgumentArray);

            // Create an instance of that type
            return(Activator.CreateInstance(concreteType));
        }