5a4151d35981b5fe8a09b04d5d09a1fd06e67a46
[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.Xaml.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.GetMethod != null && pi.Name == membername && pi.GetMethod.IsStatic);
40             if (pinfo != null)
41                 return pinfo.GetMethod?.Invoke(null, Array.Empty<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 }