2 using System.Collections;
3 using System.Collections.Generic;
5 using System.Reflection;
7 using Tizen.NUI.Binding.Internals;
8 using Tizen.NUI.Binding;
9 using Tizen.NUI.StyleSheets;
11 using static System.String;
13 namespace Tizen.NUI.Xaml
15 internal class ApplyPropertiesVisitor : IXamlNodeVisitor
17 public static readonly IList<XmlName> Skips = new List<XmlName> {
19 XmlName.xTypeArguments,
21 XmlName.xFactoryMethod,
26 public ApplyPropertiesVisitor(HydrationContext context, bool stopOnResourceDictionary = false)
29 StopOnResourceDictionary = stopOnResourceDictionary;
32 Dictionary<INode, object> Values => Context.Values;
33 HydrationContext Context { get; }
35 public TreeVisitingMode VisitingMode => TreeVisitingMode.BottomUp;
36 public bool StopOnDataTemplate => true;
37 public bool StopOnResourceDictionary { get; }
38 public bool VisitNodeOnDataTemplate => true;
39 public bool SkipChildren(INode node, INode parentNode) => false;
40 public bool IsResourceDictionary(ElementNode node) => typeof(ResourceDictionary).IsAssignableFrom(Context.Types[node]);
42 public void Visit(ValueNode node, INode parentNode)
44 var parentElement = parentNode as IElementNode;
45 var value = Values [node];
46 var source = Values [parentNode];
49 if (TryGetPropertyName(node, parentNode, out propertyName)) {
50 if (TrySetRuntimeName(propertyName, source, value, node))
52 if (Skips.Contains(propertyName))
54 if (parentElement.SkipProperties.Contains(propertyName))
56 if (propertyName.Equals(XamlParser.McUri, "Ignorable"))
58 SetPropertyValue(source, propertyName, value, Context.RootElement, node, Context, node);
59 } else if (IsCollectionItem(node, parentNode) && parentNode is IElementNode) {
60 // Collection element, implicit content, or implicit collection element.
61 var contentProperty = GetContentPropertyName(Context.Types[parentElement].GetTypeInfo());
62 if (contentProperty != null) {
63 var name = new XmlName(((ElementNode)parentNode).NamespaceURI, contentProperty);
64 if (Skips.Contains(name))
66 if (parentElement.SkipProperties.Contains(propertyName))
68 SetPropertyValue(source, name, value, Context.RootElement, node, Context, node);
73 public void Visit(MarkupNode node, INode parentNode)
77 public void Visit(ElementNode node, INode parentNode)
80 if (TryGetPropertyName(node, parentNode, out propertyName) && propertyName == XmlName._CreateContent) {
81 var s0 = Values[parentNode];
82 if (s0 is ElementTemplate) {
83 SetTemplate(s0 as ElementTemplate, node);
88 var parentElement = parentNode as IElementNode;
89 propertyName = XmlName.Empty;
91 //Simplify ListNodes with single elements
92 var pList = parentNode as ListNode;
93 if (pList != null && pList.CollectionItems.Count == 1) {
94 propertyName = pList.XmlName;
95 parentNode = parentNode.Parent;
96 parentElement = parentNode as IElementNode;
99 var value = Values[node];
101 if (propertyName != XmlName.Empty || TryGetPropertyName(node, parentNode, out propertyName)) {
102 if (Skips.Contains(propertyName))
104 if (parentElement == null)
106 if (parentElement.SkipProperties.Contains(propertyName))
109 var source = Values[parentNode];
110 ProvideValue(ref value, node, source, propertyName);
111 SetPropertyValue(source, propertyName, value, Context.RootElement, node, Context, node);
113 else if (IsCollectionItem(node, parentNode) && parentNode is IElementNode) {
114 var source = Values[parentNode];
115 ProvideValue(ref value, node, source, XmlName.Empty);
116 string contentProperty;
117 Exception xpe = null;
118 var xKey = node.Properties.ContainsKey(XmlName.xKey) ? ((ValueNode)node.Properties[XmlName.xKey]).Value as string : null;
121 if (xpe == null && TryAddToResourceDictionary(source as ResourceDictionary, value, xKey, node, out xpe))
124 // Collection element, implicit content, or implicit collection element.
125 if (xpe == null && typeof(IEnumerable).IsAssignableFrom(Context.Types[parentElement]) && Context.Types[parentElement].GetRuntimeMethods().Any(mi => mi.Name == "Add" && mi.GetParameters().Length == 1)) {
127 Context.Types[parentElement].GetRuntimeMethods().First(mi => mi.Name == "Add" && mi.GetParameters().Length == 1);
129 addMethod.Invoke(source, new[] { value });
132 if (xpe == null && (contentProperty = GetContentPropertyName(Context.Types[parentElement].GetTypeInfo())) != null) {
133 var name = new XmlName(node.NamespaceURI, contentProperty);
134 if (Skips.Contains(name))
136 if (parentElement.SkipProperties.Contains(propertyName))
139 SetPropertyValue(source, name, value, Context.RootElement, node, Context, node);
142 if (xpe == null && Context.Types[parentElement].GetRuntimeMethods().Any(mi => mi.Name == "Add" && mi.GetParameters().Length == 1))
144 //if there are similar parameters in the function, this will exist issue.
145 var addMethod = Context.Types[parentElement].GetRuntimeMethods().First(mi => mi.Name == "Add" && mi.GetParameters().Length == 1);
146 if(addMethod != null) addMethod.Invoke(source, new[] { value });
149 xpe = xpe ?? new XamlParseException($"Can not set the content of {((IElementNode)parentNode).XmlType.Name} as it doesn't have a ContentPropertyAttribute", node);
150 if (Context.ExceptionHandler != null)
151 Context.ExceptionHandler(xpe);
154 else if (IsCollectionItem(node, parentNode) && parentNode is ListNode) {
155 var source = Values[parentNode.Parent];
156 ProvideValue(ref value, node, source, XmlName.Empty);
157 var parentList = (ListNode)parentNode;
158 if (Skips.Contains(parentList.XmlName))
160 Exception xpe = null;
161 var xKey = node.Properties.ContainsKey(XmlName.xKey) ? ((ValueNode)node.Properties[XmlName.xKey]).Value as string : null;
164 var collection = GetPropertyValue(source, parentList.XmlName, Context, parentList, out _) as IEnumerable;
165 if (collection == null)
166 xpe = new XamlParseException($"Property {parentList.XmlName.LocalName} is null or is not IEnumerable", node);
168 if (xpe == null && TryAddToResourceDictionary(collection as ResourceDictionary, value, xKey, node, out xpe))
171 MethodInfo addMethod;
172 if (xpe == null && (addMethod = collection.GetType().GetRuntimeMethods().First(mi => mi.Name == "Add" && mi.GetParameters().Length == 1)) != null) {
173 addMethod.Invoke(collection, new[] { Values[node] });
176 xpe = xpe ?? new XamlParseException($"Value of {parentList.XmlName.LocalName} does not have a Add() method", node);
177 if (Context.ExceptionHandler != null)
178 Context.ExceptionHandler(xpe);
186 public void Visit(RootNode node, INode parentNode)
190 public void Visit(ListNode node, INode parentNode)
194 public static bool TryGetPropertyName(INode node, INode parentNode, out XmlName name)
196 name = default(XmlName);
197 var parentElement = parentNode as IElementNode;
198 if (parentElement == null)
200 foreach (var kvp in parentElement.Properties) {
201 if (kvp.Value != node)
209 internal static bool IsCollectionItem(INode node, INode parentNode)
211 var parentList = parentNode as IListNode;
212 if (parentList == null)
214 return parentList.CollectionItems.Contains(node);
217 internal static string GetContentPropertyName(System.Reflection.TypeInfo typeInfo)
219 while (typeInfo != null) {
220 var propName = GetContentPropertyName(typeInfo.CustomAttributes);
221 if (propName != null)
223 typeInfo = typeInfo?.BaseType?.GetTypeInfo();
228 void ProvideValue(ref object value, ElementNode node, object source, XmlName propertyName)
230 var markupExtension = value as IMarkupExtension;
231 var valueProvider = value as IValueProvider;
233 if (markupExtension == null && valueProvider == null)
236 XamlServiceProvider serviceProvider = null;
237 if (value.GetType().GetTypeInfo().GetCustomAttribute<AcceptEmptyServiceProviderAttribute>() == null)
238 serviceProvider = new XamlServiceProvider(node, Context);
240 if (serviceProvider != null && serviceProvider.IProvideValueTarget != null && propertyName != XmlName.Empty)
241 ((XamlValueTargetProvider)serviceProvider.IProvideValueTarget).TargetProperty = GetTargetProperty(source, propertyName, Context, node);
243 if (markupExtension != null)
244 value = markupExtension.ProvideValue(serviceProvider);
245 else if (valueProvider != null)
246 value = valueProvider.ProvideValue(serviceProvider);
249 static string GetContentPropertyName(IEnumerable<CustomAttributeData> attributes)
251 var contentAttribute =
252 attributes.FirstOrDefault(cad => ContentPropertyAttribute.ContentPropertyTypes.Contains(cad.AttributeType.FullName));
253 if (contentAttribute == null || contentAttribute.ConstructorArguments.Count != 1)
255 if (contentAttribute.ConstructorArguments [0].ArgumentType == typeof(string))
256 return (string)contentAttribute.ConstructorArguments [0].Value;
260 static bool GetRealNameAndType(ref Type elementType, string namespaceURI, ref string localname,
261 HydrationContext context, IXmlLineInfo lineInfo)
263 var dotIdx = localname.IndexOf('.');
265 var typename = localname.Substring(0, dotIdx);
266 localname = localname.Substring(dotIdx + 1);
267 XamlParseException xpe;
268 elementType = XamlParser.GetElementType(new XmlType(namespaceURI, typename, null), lineInfo,
269 context.RootElement.GetType().GetTypeInfo().Assembly, out xpe);
278 static BindableProperty GetBindableProperty(Type elementType, string localName, IXmlLineInfo lineInfo,
279 bool throwOnError = false)
282 var bindableFieldInfo = elementType.GetFields().FirstOrDefault(fi => fi.Name == localName + "Property");
284 var bindableFieldInfo = elementType.GetFields(BindingFlags.Static | BindingFlags.NonPublic|BindingFlags.FlattenHierarchy).FirstOrDefault(fi => fi.Name == localName + "Property");
286 if (null == bindableFieldInfo)
288 bindableFieldInfo = elementType.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy).FirstOrDefault(fi => fi.Name == localName + "Property");
291 Exception exception = null;
292 if (exception == null && bindableFieldInfo == null) {
294 new XamlParseException(
295 Format("BindableProperty {0} not found on {1}", localName + "Property", elementType.Name), lineInfo);
298 if (exception == null)
299 return bindableFieldInfo.GetValue(null) as BindableProperty;
305 static object GetTargetProperty(object xamlelement, XmlName propertyName, HydrationContext context, IXmlLineInfo lineInfo)
307 var localName = propertyName.LocalName;
308 //If it's an attached BP, update elementType and propertyName
309 var bpOwnerType = xamlelement.GetType();
310 GetRealNameAndType(ref bpOwnerType, propertyName.NamespaceURI, ref localName, context, lineInfo);
311 var property = GetBindableProperty(bpOwnerType, localName, lineInfo, false);
313 if (property != null)
316 var elementType = xamlelement.GetType();
317 var propertyInfo = elementType.GetRuntimeProperties().FirstOrDefault(p => p.Name == localName);
321 public static void SetPropertyValue(object xamlelement, XmlName propertyName, object value, object rootElement, INode node, HydrationContext context, IXmlLineInfo lineInfo)
323 var localName = propertyName.LocalName;
324 var serviceProvider = new XamlServiceProvider(node, context);
325 Exception xpe = null;
326 var xKey = node is IElementNode && ((IElementNode)node).Properties.ContainsKey(XmlName.xKey) ? ((ValueNode)((IElementNode)node).Properties[XmlName.xKey]).Value as string : null;
328 //If it's an attached BP, update elementType and propertyName
329 var bpOwnerType = xamlelement.GetType();
330 var attached = GetRealNameAndType(ref bpOwnerType, propertyName.NamespaceURI, ref localName, context, lineInfo);
331 var property = GetBindableProperty(bpOwnerType, localName, lineInfo, false);
333 //If the target is an event, connect
334 if (xpe == null && TryConnectEvent(xamlelement, localName, attached, value, rootElement, lineInfo, out xpe))
337 //If Value is DynamicResource and it's a BP, SetDynamicResource
338 if (xpe == null && TrySetDynamicResource(xamlelement, property, value, lineInfo, out xpe))
341 //If value is BindingBase, SetBinding
342 if (xpe == null && TrySetBinding(xamlelement, property, localName, value, lineInfo, out xpe))
345 //If it's a BindableProberty, SetValue
346 if (xpe == null && TrySetValue(xamlelement, property, attached, value, lineInfo, serviceProvider, out xpe))
349 //If we can assign that value to a normal property, let's do it
350 if (xpe == null && TrySetProperty(xamlelement, localName, value, lineInfo, serviceProvider, context, out xpe))
353 //If it's an already initialized property, add to it
354 if (xpe == null && TryAddToProperty(xamlelement, propertyName, value, xKey, lineInfo, serviceProvider, context, out xpe))
357 xpe = xpe ?? new XamlParseException($"Cannot assign property \"{localName}\": Property does not exist, or is not assignable, or mismatching type between value and property", lineInfo);
358 if (context.ExceptionHandler != null)
359 context.ExceptionHandler(xpe);
364 public static object GetPropertyValue(object xamlElement, XmlName propertyName, HydrationContext context, IXmlLineInfo lineInfo, out object targetProperty)
366 var localName = propertyName.LocalName;
367 Exception xpe = null;
369 targetProperty = null;
371 //If it's an attached BP, update elementType and propertyName
372 var bpOwnerType = xamlElement.GetType();
373 var attached = GetRealNameAndType(ref bpOwnerType, propertyName.NamespaceURI, ref localName, context, lineInfo);
374 var property = GetBindableProperty(bpOwnerType, localName, lineInfo, false);
376 //If it's a BindableProberty, GetValue
377 if (xpe == null && TryGetValue(xamlElement, property, attached, out value, lineInfo, out xpe, out targetProperty))
380 //If it's a normal property, get it
381 if (xpe == null && TryGetProperty(xamlElement, localName, out value, lineInfo, context, out xpe, out targetProperty))
384 xpe = xpe ?? new XamlParseException($"Property {localName} is not found or does not have an accessible getter", lineInfo);
385 if (context.ExceptionHandler != null)
386 context.ExceptionHandler(xpe);
393 static bool TryConnectEvent(object element, string localName, bool attached, object value, object rootElement, IXmlLineInfo lineInfo, out Exception exception)
400 var elementType = element.GetType();
401 var eventInfo = elementType.GetRuntimeEvent(localName);
402 var stringValue = value as string;
404 if (eventInfo == null || IsNullOrEmpty(stringValue))
407 var methodInfo = rootElement.GetType().GetRuntimeMethods().FirstOrDefault(mi => mi.Name == (string)value);
408 if (methodInfo == null) {
409 exception = new XamlParseException($"No method {value} found on type {rootElement.GetType()}", lineInfo);
414 eventInfo.AddEventHandler(element, methodInfo.CreateDelegate(eventInfo.EventHandlerType, rootElement));
416 } catch (ArgumentException ae) {
417 exception = new XamlParseException($"Method {stringValue} does not have the correct signature", lineInfo, ae);
422 static bool TrySetDynamicResource(object element, BindableProperty property, object value, IXmlLineInfo lineInfo, out Exception exception)
426 var elementType = element.GetType();
427 var dynamicResource = value as DynamicResource;
428 var bindable = element as BindableObject;
430 if (dynamicResource == null || property == null)
433 if (bindable == null) {
434 exception = new XamlParseException($"{elementType.Name} is not a BindableObject", lineInfo);
438 bindable.SetDynamicResource(property, dynamicResource.Key);
442 static bool TrySetBinding(object element, BindableProperty property, string localName, object value, IXmlLineInfo lineInfo, out Exception exception)
446 var elementType = element.GetType();
447 var binding = value.ConvertTo(typeof(BindingBase),pinfoRetriever:null,serviceProvider:null) as BindingBase;
448 var bindable = element as BindableObject;
449 var nativeBindingService = DependencyService.Get<INativeBindingService>();
454 if (bindable != null && property != null) {
455 bindable.SetBinding(property, binding);
459 if (nativeBindingService != null && property != null && nativeBindingService.TrySetBinding(element, property, binding))
462 if (nativeBindingService != null && nativeBindingService.TrySetBinding(element, localName, binding))
465 if (property != null)
466 exception = new XamlParseException($"{elementType.Name} is not a BindableObject or does not support native bindings", lineInfo);
471 static bool TrySetValue(object element, BindableProperty property, bool attached, object value, IXmlLineInfo lineInfo, XamlServiceProvider serviceProvider, out Exception exception)
475 var elementType = element.GetType();
476 var bindable = element as BindableObject;
477 var nativeBindingService = DependencyService.Get<INativeBindingService>();
479 if (property == null)
482 if (serviceProvider != null && serviceProvider.IProvideValueTarget != null)
483 ((XamlValueTargetProvider)serviceProvider.IProvideValueTarget).TargetProperty = property;
485 Func<MemberInfo> minforetriever;
487 minforetriever = () => property.DeclaringType.GetRuntimeMethod("Get" + property.PropertyName, new [] { typeof(BindableObject) });
490 minforetriever = () => property.DeclaringType.GetRuntimeProperties().LastOrDefault(p => p.Name == property.PropertyName);
492 //minforetriever = () => property.DeclaringType.GetRuntimeProperty(property.PropertyName);
493 var convertedValue = value.ConvertTo(property.ReturnType, minforetriever, serviceProvider);
495 if (bindable != null) {
496 //SetValue doesn't throw on mismatching type, so check before to get a chance to try the property setting or the collection adding
497 var nullable = property.ReturnTypeInfo.IsGenericType &&
498 property.ReturnTypeInfo.GetGenericTypeDefinition() == typeof(Nullable<>);
499 if ((convertedValue == null && (!property.ReturnTypeInfo.IsValueType || nullable)) ||
500 (property.ReturnType.IsInstanceOfType(convertedValue))) {
501 bindable.SetValue(property, convertedValue);
505 // This might be a collection; see if we can add to it
506 return TryAddValue(bindable, property, value, serviceProvider);
509 if (nativeBindingService != null && nativeBindingService.TrySetValue(element, property, convertedValue))
512 exception = new XamlParseException($"{elementType.Name} is not a BindableObject or does not support setting native BindableProperties", lineInfo);
516 static bool TryGetValue(object element, BindableProperty property, bool attached, out object value, IXmlLineInfo lineInfo, out Exception exception, out object targetProperty)
520 targetProperty = property;
521 var elementType = element.GetType();
522 var bindable = element as BindableObject;
524 if (property == null)
527 if (bindable == null)
530 value = bindable.GetValue(property);
534 static bool TrySetProperty(object element, string localName, object value, IXmlLineInfo lineInfo, XamlServiceProvider serviceProvider, HydrationContext context, out Exception exception)
538 var elementType = element.GetType();
539 var propertyInfo = elementType.GetRuntimeProperties().FirstOrDefault(p => p.Name == localName);
541 if (propertyInfo == null || !propertyInfo.CanWrite || (setter = propertyInfo.SetMethod) == null)
544 if (!IsVisibleFrom(setter, context.RootElement))
547 if (serviceProvider != null && serviceProvider.IProvideValueTarget != null)
548 ((XamlValueTargetProvider)serviceProvider.IProvideValueTarget).TargetProperty = propertyInfo;
550 object convertedValue = value.ConvertTo(propertyInfo.PropertyType, () => propertyInfo, serviceProvider);
551 if (convertedValue != null && !propertyInfo.PropertyType.IsInstanceOfType(convertedValue))
554 setter.Invoke(element, new object [] { convertedValue });
558 static bool TryGetProperty(object element, string localName, out object value, IXmlLineInfo lineInfo, HydrationContext context, out Exception exception, out object targetProperty)
562 var elementType = element.GetType();
563 PropertyInfo propertyInfo = null;
565 propertyInfo = elementType.GetRuntimeProperty(localName);
566 } catch (AmbiguousMatchException) {
567 // Get most derived instance of property
568 foreach (var property in elementType.GetRuntimeProperties().Where(prop => prop.Name == localName)) {
569 if (propertyInfo == null || propertyInfo.DeclaringType.IsAssignableFrom(property.DeclaringType))
570 propertyInfo = property;
574 targetProperty = propertyInfo;
575 if (propertyInfo == null || !propertyInfo.CanRead || (getter = propertyInfo.GetMethod) == null)
578 if (!IsVisibleFrom(getter, context.RootElement))
581 value = getter.Invoke(element, new object[] { });
585 static bool IsVisibleFrom(MethodInfo method, object rootElement)
589 if (method.IsPrivate && method.DeclaringType == rootElement.GetType())
591 if ((method.IsAssembly || method.IsFamilyOrAssembly) && method.DeclaringType.AssemblyQualifiedName == rootElement.GetType().AssemblyQualifiedName)
593 if (method.IsFamily && method.DeclaringType.IsAssignableFrom(rootElement.GetType()))
598 static bool TryAddToProperty(object element, XmlName propertyName, object value, string xKey, IXmlLineInfo lineInfo, XamlServiceProvider serviceProvider, HydrationContext context, out Exception exception)
602 object targetProperty;
603 var collection = GetPropertyValue(element, propertyName, context, lineInfo, out targetProperty) as IEnumerable;
605 if (collection == null)
608 if (exception == null && TryAddToResourceDictionary(collection as ResourceDictionary, value, xKey, lineInfo, out exception))
611 if (exception != null)
614 var addMethod = collection.GetType().GetRuntimeMethods().First(mi => mi.Name == "Add" && mi.GetParameters().Length == 1);
615 if (addMethod == null)
618 if (serviceProvider != null && serviceProvider.IProvideValueTarget != null)
619 ((XamlValueTargetProvider)serviceProvider.IProvideValueTarget).TargetProperty = targetProperty;
621 addMethod.Invoke(collection, new [] { value.ConvertTo(addMethod.GetParameters() [0].ParameterType, (Func<TypeConverter>)null, serviceProvider) });
625 static bool TryAddToResourceDictionary(ResourceDictionary resourceDictionary, object value, string xKey, IXmlLineInfo lineInfo, out Exception exception)
629 if (resourceDictionary == null)
633 resourceDictionary.Add(xKey, value);
634 else if (value is Tizen.NUI.Binding.Style)
635 resourceDictionary.Add((Tizen.NUI.Binding.Style)value);
636 else if (value is ResourceDictionary)
637 resourceDictionary.Add((ResourceDictionary)value);
638 else if (value is StyleSheets.StyleSheet)
639 resourceDictionary.Add((StyleSheets.StyleSheet)value);
641 exception = new XamlParseException("resources in ResourceDictionary require a x:Key attribute", lineInfo);
647 void SetTemplate(ElementTemplate dt, INode node)
649 #pragma warning disable 0612
650 ((IDataTemplate)dt).LoadTemplate = () => {
651 #pragma warning restore 0612
652 var cnode = node.Clone();
653 var context = new HydrationContext { ParentContext = Context, RootElement = Context.RootElement };
654 cnode.Accept(new XamlNodeVisitor((n, parent) => n.Parent = parent), node.Parent); //set parents for {StaticResource}
655 cnode.Accept(new ExpandMarkupsVisitor(context), null);
656 cnode.Accept(new NamescopingVisitor(context), null);
657 cnode.Accept(new CreateValuesVisitor(context), null);
658 cnode.Accept(new RegisterXNamesVisitor(context), null);
659 cnode.Accept(new FillResourceDictionariesVisitor(context), null);
660 cnode.Accept(new ApplyPropertiesVisitor(context, true), null);
661 return context.Values [cnode];
665 static bool TryAddValue(BindableObject bindable, BindableProperty property, object value, XamlServiceProvider serviceProvider)
667 if(property?.ReturnTypeInfo?.GenericTypeArguments == null){
671 if(property.ReturnType == null){
675 if (property.ReturnTypeInfo.GenericTypeArguments.Length != 1 ||
676 !property.ReturnTypeInfo.GenericTypeArguments[0].IsInstanceOfType(value))
679 // This might be a collection we can add to; see if we can find an Add method
680 var addMethod = GetAllRuntimeMethods(property.ReturnType)
681 .FirstOrDefault(mi => mi.Name == "Add" && mi.GetParameters().Length == 1);
682 if (addMethod == null)
685 // If there's an add method, get the collection
686 var collection = bindable.GetValue(property);
688 // And add the new value to it
689 addMethod.Invoke(collection, new[] { value.ConvertTo(addMethod.GetParameters()[0].ParameterType, (Func<TypeConverter>)null, serviceProvider) });
693 static IEnumerable<MethodInfo> GetAllRuntimeMethods(Type type)
695 return type.GetRuntimeMethods()
696 .Concat(type.GetTypeInfo().ImplementedInterfaces.SelectMany(t => t.GetRuntimeMethods()));
699 bool TrySetRuntimeName(XmlName propertyName, object source, object value, ValueNode node)
701 if (propertyName != XmlName.xName)
704 var runTimeName = source.GetType().GetTypeInfo().GetCustomAttribute<RuntimeNamePropertyAttribute>();
705 if (runTimeName == null)
708 SetPropertyValue(source, new XmlName("", runTimeName.Name), value, Context.RootElement, node, Context, node);