public override object ProvideValue (IServiceProvider serviceProvider)
{
if (serviceProvider == null)
throw new ArgumentNullException ();
if (member == null)
throw new ArgumentNullException ();
IXamlTypeResolver resolver = serviceProvider.GetService (typeof (IXamlTypeResolver)) as IXamlTypeResolver;
if (resolver == null)
throw new ArgumentException ("Markup extension 'StaticExtension' requires 'IXamlTypeResolver' be implemented in the IServiceProvider for ProvideValue");
int dot = member.LastIndexOf ('.');
string typeName = member.Substring (0, dot);
string memberName = member.Substring (dot + 1);
Type type = resolver.Resolve (typeName);
// we don't check type here for nullness, as WPF raises a NRE
PropertyInfo pi = type.GetProperty (memberName, BindingFlags.Public | BindingFlags.Static);
if (pi != null)
return pi.GetValue (null, null);
FieldInfo fi = type.GetField (memberName, BindingFlags.Public | BindingFlags.Static);
if (fi != null)
return fi.GetValue (null);
throw new ArgumentException (string.Format ("'{0}' StaticExtension value cannot be resolved to an enumeration, static field, or static property", member));
}