2 using System.ComponentModel;
4 using System.Reflection;
6 using Tizen.NUI.Binding;
8 namespace Tizen.NUI.Xaml
10 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
11 [EditorBrowsable(EditorBrowsableState.Never)]
12 [ContentProperty(nameof(Member))]
13 [ProvideCompiled("Tizen.NUI.Xaml.Build.Tasks.StaticExtension")]
14 public class StaticExtension : IMarkupExtension
16 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
17 [EditorBrowsable(EditorBrowsableState.Never)]
18 public string Member { get; set; }
20 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
21 [EditorBrowsable(EditorBrowsableState.Never)]
22 public object ProvideValue(IServiceProvider serviceProvider)
24 IXmlLineInfoProvider lineInfoProvider;
25 IXmlLineInfo lineInfo;
27 if (serviceProvider == null)
28 throw new ArgumentNullException(nameof(serviceProvider));
29 var typeResolver = serviceProvider.GetService(typeof (IXamlTypeResolver)) as IXamlTypeResolver;
30 if (typeResolver == null)
31 throw new ArgumentException("No IXamlTypeResolver in IServiceProvider");
33 if (string.IsNullOrEmpty(Member) || !Member.Contains("."))
35 lineInfoProvider = serviceProvider.GetService(typeof (IXmlLineInfoProvider)) as IXmlLineInfoProvider;
36 lineInfo = (lineInfoProvider != null) ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
37 throw new XamlParseException("Syntax for x:Static is [Member=][prefix:]typeName.staticMemberName", lineInfo);
40 var dotIdx = Member.LastIndexOf('.');
41 var typename = Member.Substring(0, dotIdx);
42 var membername = Member.Substring(dotIdx + 1);
44 var type = typeResolver.Resolve(typename, serviceProvider);
46 var pinfo = type.GetRuntimeProperties().FirstOrDefault(pi => pi.GetMethod != null && pi.Name == membername && pi.GetMethod.IsStatic);
48 return pinfo.GetMethod?.Invoke(null, Array.Empty<object>());
50 var finfo = type.GetRuntimeFields().FirstOrDefault(fi => fi.Name == membername && fi.IsStatic);
52 return finfo.GetValue(null);
54 lineInfoProvider = serviceProvider.GetService(typeof (IXmlLineInfoProvider)) as IXmlLineInfoProvider;
55 lineInfo = (lineInfoProvider != null) ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
56 throw new XamlParseException($"No static member found for {Member}", lineInfo);