/
ReferenceTypeConverter.cs
52 lines (45 loc) · 1.87 KB
/
ReferenceTypeConverter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Globalization;
using Xamarin.Forms.Internals;
using Xamarin.Forms.Xaml;
using Xamarin.Forms.Xaml.Internals;
namespace Xamarin.Forms
{
public sealed class ReferenceTypeConverter : TypeConverter, IExtendedTypeConverter
{
object IExtendedTypeConverter.ConvertFrom(CultureInfo culture, object value, IServiceProvider serviceProvider)
{
return ((IExtendedTypeConverter)this).ConvertFromInvariantString(value as string, serviceProvider);
}
object IExtendedTypeConverter.ConvertFromInvariantString(string value, IServiceProvider serviceProvider)
{
if (serviceProvider == null)
throw new ArgumentNullException(nameof(serviceProvider));
var referenceProvider = serviceProvider.GetService<IReferenceProvider>();
if (referenceProvider != null)
return referenceProvider.FindByName(value) ?? throw new XamlParseException($"Can't resolve name '{value}' on Element", serviceProvider);
#pragma warning disable CS0612 // Type or member is obsolete
//legacy path
if (!(serviceProvider.GetService(typeof(IProvideValueTarget)) is IProvideParentValues valueProvider))
throw new ArgumentException("serviceProvider does not provide an IProvideValueTarget");
if (serviceProvider.GetService(typeof(INameScopeProvider)) is INameScopeProvider namescopeprovider && namescopeprovider.NameScope != null) {
var element = namescopeprovider.NameScope.FindByName(value);
if (element != null)
return element;
}
foreach (var target in valueProvider.ParentObjects) {
if (!(target is INameScope ns))
continue;
var element = ns.FindByName(value);
if (element != null)
return element;
}
throw new Exception("Can't resolve name on Element");
#pragma warning restore CS0612 // Type or member is obsolete
}
public override object ConvertFromInvariantString(string value)
{
throw new NotImplementedException();
}
}
}