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}