-
Notifications
You must be signed in to change notification settings - Fork 14
/
DefaultConverterResolver.cs
88 lines (74 loc) · 3.13 KB
/
DefaultConverterResolver.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using System;
using System.Collections.Generic;
using System.Linq;
namespace Dbosoft.YaNco.TypeMapping
{
public class DefaultConverterResolver : IRfcConverterResolver
{
private readonly IEnumerable<Type> _toRfcConverters;
private readonly IEnumerable<Type> _fromRfcConverters;
public static DefaultConverterResolver CreateWithBuildInConverters(
IEnumerable<Type> fromRfcConverters = null, IEnumerable<Type> toRfcConverters = null)
{
fromRfcConverters = (fromRfcConverters ?? new Type[0]).Append(new []
{
typeof(DateTimeValueConverter),
typeof(ByteValueConverter),
typeof(DictionaryFromAbapStructureValueConverter),
typeof(ListFromAbapTableValueConverter),
typeof(DefaultFromAbapValueConverter<>),
});
toRfcConverters = (toRfcConverters ?? new Type[0]).Append(new[]
{
typeof(IntValueConverter<>),
typeof(LongValueConverter<>),
typeof(StringValueConverter<>),
typeof(ByteValueConverter),
typeof(DateTimeValueConverter)
});
return new DefaultConverterResolver(
fromRfcConverters, toRfcConverters);
}
public DefaultConverterResolver(IEnumerable<Type> fromRfcConverters, IEnumerable<Type> toRfcConverters)
{
_fromRfcConverters = fromRfcConverters;
_toRfcConverters = toRfcConverters;
}
protected virtual object CreateConverter(Type type, Type targetType = null, Type abapType = null)
{
if (!type.IsGenericTypeDefinition)
return Activator.CreateInstance(type);
var typeArguments = new List<Type>();
foreach (var argument in type.GetGenericArguments())
{
if (!(targetType is null) && !argument.IsSubclassOf(typeof(AbapValue)))
{
typeArguments.Add(targetType);
}
else
{
if (abapType == null) continue;
if (abapType.IsSubclassOf(typeof(AbapValue)))
typeArguments.Add(abapType);
}
}
return Activator.CreateInstance(type.MakeGenericType(typeArguments.ToArray()));
}
public IEnumerable<IToAbapValueConverter<T>> GetToRfcConverters<T>(RfcType rfcType)
{
return _toRfcConverters
.Map(type => CreateConverter(type, typeof(T)) as IToAbapValueConverter<T>)
.Where(c => c != null)
.Where(c => c.CanConvertFrom(rfcType));
}
public IEnumerable<IFromAbapValueConverter<T>> GetFromRfcConverters<T>(RfcType rfcType, Type abapValueType)
{
return _fromRfcConverters
.Map(type =>
(CreateConverter(type, typeof(T), abapValueType)) as
IFromAbapValueConverter<T>)
.Where(c => c != null)
.Where(c => c.CanConvertTo(rfcType));
}
}
}