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); }
/// <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)); }
// 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)); }