This repository has been archived by the owner on Apr 5, 2022. It is now read-only.
/
PropertyManager.cs
78 lines (68 loc) · 2.96 KB
/
PropertyManager.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
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using EPiServer.Core;
namespace JOS.ContentSerializer.Internal
{
public class PropertyManager : IPropertyManager
{
private static readonly ConcurrentDictionary<Type, MethodInfo> CachedHandleMethodInfos;
private readonly IPropertyResolver _propertyResolver;
private readonly IPropertyNameStrategy _propertyNameStrategy;
private readonly IPropertyHandlerService _propertyHandlerService;
static PropertyManager()
{
CachedHandleMethodInfos = new ConcurrentDictionary<Type, MethodInfo>();
}
public PropertyManager(
IPropertyNameStrategy propertyNameStrategy,
IPropertyResolver propertyResolver,
IPropertyHandlerService propertyHandlerService
)
{
_propertyNameStrategy = propertyNameStrategy ?? throw new ArgumentNullException(nameof(propertyNameStrategy));
_propertyResolver = propertyResolver ?? throw new ArgumentNullException(nameof(propertyResolver));
_propertyHandlerService = propertyHandlerService;
}
public Dictionary<string, object> GetStructuredData(
IContentData contentData,
IContentSerializerSettings settings)
{
var properties = this._propertyResolver.GetProperties(contentData);
var structuredData = new Dictionary<string, object>();
foreach (var property in properties)
{
var propertyHandler = this._propertyHandlerService.GetPropertyHandler(property);
if (propertyHandler == null)
{
Trace.WriteLine($"No PropertyHandler was found for type '{property.PropertyType}'");
continue;
}
var method = GetMethodInfo(propertyHandler);
var key = this._propertyNameStrategy.GetPropertyName(property);
var value = property.GetValue(contentData);
var result = method.Invoke(propertyHandler, new[] { value, property, contentData, settings });
structuredData.Add(key, result);
}
return structuredData;
}
private static MethodInfo GetMethodInfo(object propertyHandler)
{
var type = propertyHandler.GetType();
if (CachedHandleMethodInfos.ContainsKey(type))
{
CachedHandleMethodInfos.TryGetValue(type, out var cachedMethod);
return cachedMethod;
}
var method = propertyHandler.GetType().GetMethods()
.Where(x => x.Name.Equals(nameof(IPropertyHandler<object>.Handle)))
.OrderByDescending(x => x.GetParameters().Length)
.First();
CachedHandleMethodInfos.TryAdd(type, method);
return method;
}
}
}