-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathApplyRules.linq
64 lines (49 loc) · 902 Bytes
/
ApplyRules.linq
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
<Query Kind="Program" />
void Main()
{
var poco = new Poco() { Id = 1, Value = "Test"};
var enforcer = new RuleEnforcer<Poco>(poco);
enforcer.local.Dump();
var result = enforcer.ApplyRule(x => x.Id == 1);
result.Dump();
result = enforcer
.Define(x => x.Id == 1)
.Define(x => x.Value == "Testy")
.Resolve();
result.Dump();
}
public record Poco
{
public int Id { get; set; }
public string Value { get; set; }
}
class RuleEnforcer<T>
{
public RuleEnforcer(T poco)
{
local = poco;
rules = new List<System.Func<T, bool>>();
}
public T local;
IList<Func<T, bool>> rules;
public RuleEnforcer<T> Define(Func<T, bool> rule)
{
rules.Add(rule);
return this;
}
public bool ApplyRule(Func<T, bool> func)
{
return func(local);
}
public bool Resolve()
{
foreach (var rule in rules)
{
if (!rule(local))
{
return false;
}
}
return true;
}
}