This repository has been archived by the owner on Dec 30, 2020. It is now read-only.
/
ClassOverridesBuilder.cs
130 lines (116 loc) · 4.47 KB
/
ClassOverridesBuilder.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using MongoDB.Configuration.Mapping.Auto;
using System.Linq.Expressions;
using System.Reflection;
namespace MongoDB.Configuration.Builders
{
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
public class ClassOverridesBuilder<T>
{
private readonly ClassOverrides _overrides;
/// <summary>
/// Initializes a new instance of the <see cref="ClassOverridesBuilder<T>"/> class.
/// </summary>
/// <param name="overrides">The overrides.</param>
internal ClassOverridesBuilder(ClassOverrides overrides)
{
if (overrides == null)
throw new ArgumentNullException("overrides");
_overrides = overrides;
}
/// <summary>
/// Collections the name.
/// </summary>
/// <param name="name">The name.</param>
public void CollectionName(string name)
{
_overrides.CollectionName = name;
}
/// <summary>
/// Ids the specified member.
/// </summary>
/// <param name="member">The member.</param>
/// <returns></returns>
public IdOverridesBuilder Id(MemberInfo member)
{
var overrides = new IdOverrides { Member = member };
return new IdOverridesBuilder(overrides);
}
/// <summary>
/// Ids the specified name.
/// </summary>
/// <param name="name">The name.</param>
/// <returns></returns>
public IdOverridesBuilder Id(string name)
{
var members = typeof(T).GetMember(name, MemberTypes.Field | MemberTypes.Property, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (members == null || members.Length == 0)
throw new InvalidOperationException("No member was found.");
if (members.Length > 1)
throw new InvalidOperationException("More than one member matched the specified name.");
return Id(members[0]);
}
/// <summary>
/// Ids the specified member.
/// </summary>
/// <param name="member">The member.</param>
/// <returns></returns>
public IdOverridesBuilder Id(Expression<Func<T, object>> member)
{
var mex = GetMemberExpression(member);
return Id(mex.Member.Name);
}
/// <summary>
/// Members the specified member.
/// </summary>
/// <param name="member">The member.</param>
/// <returns></returns>
public MemberOverridesBuilder Member(MemberInfo member)
{
var overrides = _overrides.GetOverridesFor(member);
return new MemberOverridesBuilder(overrides);
}
/// <summary>
/// Members the specified name.
/// </summary>
/// <param name="name">The name.</param>
/// <returns></returns>
public MemberOverridesBuilder Member(string name)
{
var members = typeof(T).GetMember(name, MemberTypes.Field | MemberTypes.Property, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (members == null || members.Length == 0)
throw new InvalidOperationException("No member was found.");
if (members.Length > 1)
throw new InvalidOperationException("More than one member matched the specified name.");
return Member(members[0]);
}
/// <summary>
/// Members the specified member.
/// </summary>
/// <param name="member">The member.</param>
/// <returns></returns>
public MemberOverridesBuilder Member(Expression<Func<T, object>> member)
{
var mex = GetMemberExpression(member);
return Member(mex.Member.Name);
}
/// <summary>
/// Gets the member expression.
/// </summary>
/// <param name="member">The member.</param>
/// <returns></returns>
private MemberExpression GetMemberExpression(Expression<Func<T, object>> member)
{
var memberExpression = member.Body as MemberExpression;
if (memberExpression == null)
{
var unaryExpression = member.Body as UnaryExpression;
memberExpression = unaryExpression.Operand as MemberExpression;
}
return memberExpression;
}
}
}