|
2 | 2 | using System.Collections.Generic;
|
3 | 3 | using System.Reflection;
|
4 | 4 | using System.Runtime.CompilerServices;
|
| 5 | +using UnityMvvmToolkit.Core.Converters.PropertyValueConverters; |
5 | 6 | using UnityMvvmToolkit.Core.Enums;
|
6 | 7 | using UnityMvvmToolkit.Core.Interfaces;
|
7 | 8 | using UnityMvvmToolkit.Core.Internal.Extensions;
|
@@ -50,6 +51,54 @@ public void CreateValueConverterInstances<T>(int capacity, WarmupType warmupType
|
50 | 51 | }
|
51 | 52 | }
|
52 | 53 |
|
| 54 | + public TProperty GetPropertyAs<TProperty, TValueType>(IBindingContext context, MemberInfo memberInfo) |
| 55 | + where TProperty : IBaseProperty |
| 56 | + { |
| 57 | + var property = GetMemberValue<IBaseProperty>(context, memberInfo, out var propertyType); |
| 58 | + |
| 59 | + var targetType = typeof(TValueType); |
| 60 | + var sourceType = propertyType.GenericTypeArguments[0]; |
| 61 | + |
| 62 | + if (targetType == sourceType) |
| 63 | + { |
| 64 | + return (TProperty) property; |
| 65 | + } |
| 66 | + |
| 67 | + if (targetType.IsValueType || sourceType.IsValueType) |
| 68 | + { |
| 69 | + throw new InvalidOperationException( |
| 70 | + $"{nameof(GetPropertyAs)} is not supported for value types. Use {typeof(PropertyValueConverter<,>).Name} instead."); |
| 71 | + } |
| 72 | + |
| 73 | + if (targetType.IsAssignableFrom(sourceType) == false) |
| 74 | + { |
| 75 | + throw new InvalidCastException($"Can not cast the '{sourceType}' to the '{targetType}'."); |
| 76 | + } |
| 77 | + |
| 78 | + var converterId = HashCodeHelper.GetPropertyWrapperConverterId(targetType, sourceType); |
| 79 | + |
| 80 | + if (_wrappersByConverter.TryGetValue(converterId, out var propertyWrappers)) |
| 81 | + { |
| 82 | + if (propertyWrappers.Count > 0) |
| 83 | + { |
| 84 | + return (TProperty) propertyWrappers |
| 85 | + .Dequeue() |
| 86 | + .AsPropertyWrapper() |
| 87 | + .SetProperty(property); |
| 88 | + } |
| 89 | + } |
| 90 | + else |
| 91 | + { |
| 92 | + _wrappersByConverter.Add(converterId, new Queue<IObjectWrapper>()); |
| 93 | + } |
| 94 | + |
| 95 | + var wrapperType = property is IProperty |
| 96 | + ? typeof(PropertyCastWrapper<,>).MakeGenericType(sourceType, targetType) |
| 97 | + : typeof(ReadOnlyPropertyCastWrapper<,>).MakeGenericType(sourceType, targetType); |
| 98 | + |
| 99 | + return (TProperty) ObjectWrapperHelper.CreatePropertyWrapper(wrapperType, default, converterId, property); |
| 100 | + } |
| 101 | + |
53 | 102 | public TProperty GetProperty<TProperty, TValueType>(IBindingContext context, BindingData bindingData,
|
54 | 103 | MemberInfo memberInfo) where TProperty : IBaseProperty
|
55 | 104 | {
|
|
0 commit comments