Merge pull request #4536 from kumpera/block-rebind-of-banned-assemblies
[mono.git] / mcs / class / System.Xaml / System.Windows.Markup / TypeExtension.cs
index 8a868b5bc86027d17f3b8c46753ae3cba0032247..42da7a137836bac58988c6cc4200e543b47a131f 100755 (executable)
@@ -29,19 +29,32 @@ using System.Xaml.Schema;
 namespace System.Windows.Markup
 {
        [MarkupExtensionReturnType (typeof (Type))]
+       [TypeConverter (typeof (TypeExtensionConverter))]
+       [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyPresentationFramework_3_5)]
        public class TypeExtension : MarkupExtension
        {
+               public TypeExtension ()
+               {
+               }
+
                public TypeExtension (string typeName)
                {
+                       if (typeName == null)
+                               throw new ArgumentNullException ("typeName");
                        TypeName = typeName;
                }
 
                public TypeExtension (Type type)
                {
+                       if (type == null)
+                               throw new ArgumentNullException ("type");
                        Type = type;
                }
 
+               [ConstructorArgument ("type")]
+               [DefaultValue (null)]
                public Type Type { get; set; }
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public string TypeName { get; set; }
 
                public override object ProvideValue (IServiceProvider serviceProvider)
@@ -49,16 +62,20 @@ namespace System.Windows.Markup
                        if (Type != null)
                                return Type;
 
-                       if (serviceProvider == null) // it can be null when Type is supplied.
-                               throw new ArgumentNullException ("serviceProvider");
                        if (TypeName == null)
                                throw new InvalidOperationException ("Either TypeName or Type must be filled before calling ProvideValue method");
 
-                       var p = ((object) serviceProvider) as IXamlTypeResolver;
+                       if (serviceProvider == null) // it can be null when Type is supplied.
+                               throw new ArgumentNullException ("serviceProvider");
+
+                       var p = serviceProvider.GetService (typeof (IXamlTypeResolver)) as IXamlTypeResolver;
                        if (p == null)
-                               throw new ArgumentException ("serviceProvider does not implement IXamlTypeResolver.");
+                               throw new InvalidOperationException ("serviceProvider does not provide IXamlTypeResolver service.");
 
-                       return p.Resolve (TypeName);
+                       var ret = p.Resolve (TypeName);
+                       if (ret == null)
+                               throw new InvalidOperationException (String.Format ("Type '{0}' is not resolved as a valid type by the type resolver '{1}'.", TypeName, p.GetType ()));
+                       return ret;
                }
        }
 }