1
+ < Query Kind = "Program" >
2
+ < Namespace > System . Web < / Namespace >
3
+ < / Query >
4
+
5
+ void Main ( )
6
+ {
7
+ var uri = new Uri ( "http: //localhost/home/index?msg=Hello&num=5");
8
+
9
+ var container = new MvcContainer( ) ;
10
+ var result = container . Resolve ( uri ) ;
11
+ result . Dump ( ) ;
12
+ }
13
+
14
+ public class MvcContainer {
15
+
16
+ List < Type > controllerTypes = new List < Type > ( ) ;
17
+
18
+ public MvcContainer ( )
19
+ {
20
+ var controllerType = typeof ( Controller ) ;
21
+
22
+ controllerTypes = controllerType . Assembly . GetTypes ( )
23
+ . Where( type => ! type . IsAbstract
24
+ && controllerType . IsAssignableFrom ( type ) )
25
+ . ToList ( ) ;
26
+ }
27
+
28
+ public object Resolve ( Uri uri ) {
29
+ var controller = getController ( uri ) ;
30
+ var action = getAction ( controller , uri ) ;
31
+ var parameters = getParameters ( action , uri ) ;
32
+ return action . Invoke ( controller , parameters ) ;
33
+ }
34
+
35
+ private object [ ] getParameters ( MethodInfo methodInfo , Uri uri )
36
+ {
37
+ var parameterInfos = methodInfo . GetParameters ( ) . ToList ( ) ;
38
+ if ( parameterInfos . Count == 0 ) {
39
+ return null ;
40
+ }
41
+ var results = new object [ parameterInfos . Count ] ;
42
+
43
+ var query = HttpUtility . ParseQueryString ( uri . Query ) ;
44
+
45
+ for ( int i = 0 ; i < parameterInfos . Count ; i ++ ) {
46
+ var info = parameterInfos [ i ] ;
47
+ var type = parameterInfos [ i ] . ParameterType ;
48
+ var value = query [ info . Name ] ;
49
+ if ( type == typeof ( String ) ) {
50
+ results [ i ] = value ;
51
+ }
52
+ else if ( type == typeof ( Int32 ) )
53
+ {
54
+ results [ i ] = Int32 . Parse ( value ) ;
55
+ }
56
+ }
57
+
58
+ return results ;
59
+ }
60
+
61
+ private MethodInfo getAction ( Controller controller , Uri uri )
62
+ {
63
+ var action = uri . AbsolutePath . Split ( '/' ) . Last ( ) ;
64
+
65
+ return controller . GetType ( ) . GetMethods ( )
66
+ . FirstOrDefault ( x => x . Name . Equals ( action ,
67
+ StringComparison . InvariantCultureIgnoreCase ) ) ;
68
+ }
69
+
70
+ public Controller getController ( Uri uri ) {
71
+ var controllerType = controllerTypes
72
+ . FirstOrDefault ( x => uri . AbsolutePath
73
+ . StartsWith ( $ "/{ x . Name . Replace ( "Controller" , "" ) } ",
74
+ StringComparison . InvariantCultureIgnoreCase ) ) ;
75
+
76
+
77
+ return ( Controller ) Activator . CreateInstance ( controllerType , null ) ;
78
+ }
79
+
80
+ }
81
+
82
+ public abstract class Controller { }
83
+
84
+ public class HomeController : Controller {
85
+
86
+ public string Index ( int num , string msg )
87
+ {
88
+ return $ "Hello World { msg } - { num } ";
89
+ }
90
+
91
+ public string Test ( )
92
+ {
93
+ return "Hello Test" ;
94
+ }
95
+ }
96
+
97
+ public class TestController : Controller
98
+ {
99
+
100
+ public string Index ( )
101
+ {
102
+ return "Test World" ;
103
+ }
104
+
105
+ }
0 commit comments