main
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Linq.Expressions;
5using System.Reflection;
6using gorilla.commons.utility;
7
8namespace MoMoney.boot.container.registration.mapping
9{
10 public class PropertyResolver : IPropertyResolver
11 {
12 BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic |
13 BindingFlags.FlattenHierarchy;
14
15 public PropertyInfo resolve_using<Input, PropertyType>(Expression<Func<Input, PropertyType>> expression)
16 {
17 var member_accessor = (MemberExpression) expression.Body;
18 return resolve_using(typeof (Input), member_accessor.Member.Name);
19 }
20
21 public PropertyInfo resolve_using(Type type, string property_name)
22 {
23 var property = all_properties_belonging_to(type).Where(x => x.Name.Equals(property_name)).FirstOrDefault();
24
25 if (property == null) throw new PropertyResolutionException(type, property_name);
26
27 return property;
28 }
29
30 public IEnumerable<PropertyInfo> all_properties_belonging_to(Type type)
31 {
32 var stack = new Stack<Type>();
33 stack.Push(type);
34
35 while (stack.Count > 0)
36 {
37 var type_to_interrogate = stack.Pop();
38
39 type_to_interrogate.GetInterfaces().each(stack.Push);
40 foreach (var a_property in all_properties_for(type_to_interrogate))
41 {
42 yield return a_property;
43 }
44 }
45 }
46
47 public IEnumerable<PropertyInfo> all_properties_belonging_to<T>()
48 {
49 return all_properties_belonging_to(typeof (T));
50 }
51
52 PropertyInfo[] all_properties_for(Type type)
53 {
54 return type.GetProperties(flags);
55 }
56 }
57}