58eb49d3cffb7332297ff47abd4cc678349b9da9
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / Xaml / MarkupExtensions / StaticExtension.cs
1 using System;
2 using System.Linq;
3 using System.Reflection;
4 using System.Xml;
5 using Tizen.NUI.Binding;
6
7 namespace Tizen.NUI.Xaml
8 {
9         [ContentProperty(nameof(Member))]
10         // [ProvideCompiled("Tizen.NUI.Build.Tasks.StaticExtension")]
11         internal class StaticExtension : IMarkupExtension
12         {
13                 public string Member { get; set; }
14
15                 public object ProvideValue(IServiceProvider serviceProvider)
16                 {
17                         IXmlLineInfoProvider lineInfoProvider;
18                         IXmlLineInfo lineInfo;
19
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");
25
26                         if (string.IsNullOrEmpty(Member) || !Member.Contains("."))
27                         {
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);
31                         }
32
33                         var dotIdx = Member.LastIndexOf('.');
34                         var typename = Member.Substring(0, dotIdx);
35                         var membername = Member.Substring(dotIdx + 1);
36
37                         var type = typeResolver.Resolve(typename, serviceProvider);
38
39                         var pinfo = type.GetRuntimeProperties().FirstOrDefault(pi => pi.Name == membername && pi.GetMethod.IsStatic);
40                         if (pinfo != null)
41                                 return pinfo.GetMethod.Invoke(null, new object[] { });
42
43                         var finfo = type.GetRuntimeFields().FirstOrDefault(fi => fi.Name == membername && fi.IsStatic);
44                         if (finfo != null)
45                                 return finfo.GetValue(null);
46
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);
50                 }
51         }
52 }