3 using System.Reflection;
5 using Tizen.NUI.Binding;
7 namespace Tizen.NUI.Xaml
9 [ContentProperty(nameof(Member))]
10 // [ProvideCompiled("Tizen.NUI.Build.Tasks.StaticExtension")]
11 internal class StaticExtension : IMarkupExtension
13 public string Member { get; set; }
15 public object ProvideValue(IServiceProvider serviceProvider)
17 IXmlLineInfoProvider lineInfoProvider;
18 IXmlLineInfo lineInfo;
20 if (serviceProvider == null)
21 throw new ArgumentNullException(nameof(serviceProvider));
22 var typeResolver = serviceProvider.GetService(typeof (IXamlTypeResolver)) as IXamlTypeResolver;
23 if (typeResolver == null)
24 throw new ArgumentException("No IXamlTypeResolver in IServiceProvider");
26 if (string.IsNullOrEmpty(Member) || !Member.Contains("."))
28 lineInfoProvider = serviceProvider.GetService(typeof (IXmlLineInfoProvider)) as IXmlLineInfoProvider;
29 lineInfo = (lineInfoProvider != null) ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
30 throw new XamlParseException("Syntax for x:Static is [Member=][prefix:]typeName.staticMemberName", lineInfo);
33 var dotIdx = Member.LastIndexOf('.');
34 var typename = Member.Substring(0, dotIdx);
35 var membername = Member.Substring(dotIdx + 1);
37 var type = typeResolver.Resolve(typename, serviceProvider);
39 var pinfo = type.GetRuntimeProperties().FirstOrDefault(pi => pi.Name == membername && pi.GetMethod.IsStatic);
41 return pinfo.GetMethod.Invoke(null, new object[] { });
43 var finfo = type.GetRuntimeFields().FirstOrDefault(fi => fi.Name == membername && fi.IsStatic);
45 return finfo.GetValue(null);
47 lineInfoProvider = serviceProvider.GetService(typeof (IXmlLineInfoProvider)) as IXmlLineInfoProvider;
48 lineInfo = (lineInfoProvider != null) ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
49 throw new XamlParseException($"No static member found for {Member}", lineInfo);