-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathInvokeStrategy.cs
More file actions
113 lines (99 loc) · 2.97 KB
/
InvokeStrategy.cs
File metadata and controls
113 lines (99 loc) · 2.97 KB
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
using System;
using System.Reflection;
using System.Threading.Tasks;
namespace Fnproject.Fn.Fdk
{
sealed internal class InvokeStrategyFactory
{
private InvokeStrategyFactory() { }
internal static IInvokeStrategy Create(MethodInfo method, Type classType)
{
if (method.IsStatic)
{
if (typeof(Task).IsAssignableFrom(method.ReturnType))
{
return new InvokeStaticAsync(method);
}
else
{
return new InvokeStatic(method);
}
}
else
{
if (typeof(Task).IsAssignableFrom(method.ReturnType))
{
return new InvokeNonStaticAsync(method, classType);
}
else
{
return new InvokeNonStatic(method, classType);
}
}
}
}
internal interface IInvokeStrategy
{
object Invoke(object[] args);
}
internal class InvokeStatic : IInvokeStrategy
{
private readonly MethodInfo method;
public object Invoke(object[] args)
{
return method.Invoke(null, args);
}
public InvokeStatic(MethodInfo method)
{
this.method = method;
}
}
internal class InvokeNonStaticAsync : IInvokeStrategy
{
private readonly MethodInfo method;
private readonly object instance;
public object Invoke(object[] args)
{
// Add try catch
Task task = (Task)method.Invoke(instance, args);
task.GetAwaiter().GetResult();
var resultProperty = task.GetType().GetProperty("Result");
return resultProperty.GetValue(task);
}
public InvokeNonStaticAsync(MethodInfo method, Type classType)
{
this.method = method;
instance = Activator.CreateInstance(classType);
}
}
internal class InvokeNonStatic : IInvokeStrategy
{
private readonly MethodInfo method;
private readonly object instance;
public object Invoke(object[] args)
{
return method.Invoke(instance, args);
}
public InvokeNonStatic(MethodInfo method, Type classType)
{
this.method = method;
instance = Activator.CreateInstance(classType);
}
}
internal class InvokeStaticAsync : IInvokeStrategy
{
private readonly MethodInfo method;
public object Invoke(object[] args)
{
// Add try catch
Task task = (Task)method.Invoke(null, args);
task.GetAwaiter().GetResult();
var resultProperty = task.GetType().GetProperty("Result");
return resultProperty.GetValue(task);
}
public InvokeStaticAsync(MethodInfo method)
{
this.method = method;
}
}
}