-
Notifications
You must be signed in to change notification settings - Fork 43
/
MethodValueGetter.cs
96 lines (78 loc) · 2.74 KB
/
MethodValueGetter.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
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace FubuCore.Reflection
{
public class MethodValueGetter : IValueGetter
{
private readonly MethodInfo _methodInfo;
private readonly object[] _arguments;
public MethodValueGetter(MethodInfo methodInfo, object[] arguments)
{
if (arguments.Length > 1)
{
throw new NotSupportedException("ReflectionHelper only supports methods with no arguments or a single indexer argument");
}
_methodInfo = methodInfo;
_arguments = arguments;
}
public object GetValue(object target)
{
return _methodInfo.Invoke(target, _arguments);
}
public string Name
{
get
{
if (_arguments.Length == 1) return "[{0}]".ToFormat(_arguments[0]);
if (_arguments.Length == 0) return _methodInfo.Name;
throw new NotSupportedException("Dunno how to deal with this method");
}
}
public Type DeclaringType
{
get { return _methodInfo.DeclaringType; }
}
public Type ValueType
{
get { return _methodInfo.ReturnType; }
}
public Type ReturnType
{
get { return _methodInfo.ReturnType; }
}
public Expression ChainExpression(Expression body)
{
throw new NotSupportedException();
}
public void SetValue(object target, object propertyValue)
{
throw new NotSupportedException();
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof(MethodValueGetter)) return false;
return Equals((MethodValueGetter)obj);
}
public bool Equals(MethodValueGetter other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(other._methodInfo, _methodInfo) && Enumerable.SequenceEqual(other._arguments, _arguments);
}
public override int GetHashCode()
{
unchecked
{
if (_arguments.Length != 0)
{
return ((_methodInfo != null ? _methodInfo.GetHashCode() : 0) * 397) ^ (_arguments[0] != null ? _arguments[0].GetHashCode() : 0);
}
return _methodInfo.GetHashCode();
}
}
}
}