此篇将介绍C#如何在运行时动态调用方法。当某些类型是运行时动态确定时,编译时的静态编码是无法解决这些动态对象或类的方法调用的。此篇则给你一把利剑,让动态对象的方法调用成为可能。
1.动态调用dll里的方法:
|
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 |
<span style="font-family:SimSun;font-size:12px;">/// <summary>/// 该类将被独立编入Class1.dll汇编/// </summary>class
Class1{ public
static string method1() { return
"I am Static method (method1) in class1"; } public
string method2() { return
"I am a Instance Method (method2) in Class1"; } public
string method3(string
s) { return
"Hello " + s; }}/// <summary>/// 该类独立放入Test.exe汇编/// </summary>class
DynamicInvoke{ public
static void Main(string[] args) { // 动态加载汇编 string
path = "Class1.dll"; Assembly assembly = Assembly.Load(path); // 根据类型名得到Type Type type = assembly.GetType("Class1"); // 1.根据方法名动态调用静态方法 string
str = (string)type.InvokeMember("method1", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, new
object[] { }); Console.WriteLine(str); // 2.根据方法名动态调用动态对象的成员方法 object
o = Activator.CreateInstance(type); str = (string)type.InvokeMember("method2", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new
object[] { }); Console.WriteLine(str); // 3.根据方法名动态调用动态对象的有参成员方法 object[] par = new
object[] { "kunal"
}; str = (string)type.InvokeMember("method3", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, par); Console.WriteLine(str); // 带out修饰的InvokeMember // System.Int32 中 public static bool TryParse(string s, out int result) 方法的调用 var
arguments = new
object[] { str, null
}; // 注意这里只能将参数写在外面,out参数为null也没有关系 typeof(int).InvokeMember("TryParse", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Static, null, null, arguments); Console.WriteLine(arguments[1]); }}</span> |
2.动态加载类文件并调用方法:
|
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 |
<span style="font-family:SimSun;font-size:12px;">using
System;using
System.CodeDom.Compiler;using
System.IO;using
System.Reflection;using
System.Threading;using
System.Windows.Forms;using
Microsoft.CSharp;namespace
_32.DynamicReflection{ internal
class Program { private
static void Main(string[] args) { #region 内置标签方法 (动态加载) const
string className = "DynamicReflection.Test"; //类名称一定要全称 string
fileName = <strong>Thread.GetDomain().BaseDirectory + "Test.cs";</strong> if
(File.Exists(fileName)) { var
sourceFile = new
FileInfo(fileName); CodeDomProvider provider = new
CSharpCodeProvider(); var
cp = new
CompilerParameters(); cp.ReferencedAssemblies.Add("System.dll"); //添加命名空间引用 cp.GenerateExecutable = false; // 生成类库 cp.GenerateInMemory = true; // 保存到内存 cp.TreatWarningsAsErrors = false; // 不将编译警告作为错误 // 编译 CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile.FullName); if
(cr.Errors.Count < 1) { Assembly asm = cr.CompiledAssembly; // 加载 //1.调用静态方法 Type type = asm.GetType(className); var
str =(string)type.InvokeMember("SayHello1", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, new
object[] {}); Console.WriteLine(str); //2.调用实例方法 object
instance = asm.CreateInstance(className); str =(string)type.InvokeMember("SayHello2", BindingFlags.Default | BindingFlags.InvokeMethod, null, instance,new
object[] {}); Console.WriteLine(str); //3.调用带参数的方法 var
par = new
object[] {"zhangqs008"}; str =(string)type.InvokeMember("SayHello3", BindingFlags.Default | BindingFlags.InvokeMethod, null, instance,par); Console.WriteLine(str); Console.Read(); } else { string
msg = null; for
(int
index = 0; index < cr.Errors.Count; index++) { CompilerError error = cr.Errors[index]; msg += "【错误"
+ (index + 1) + "】"
+ Environment.NewLine; msg += "[文件] "
+ error.FileName + Environment.NewLine; msg += "[位置] 行"
+ error.Line + ",列"
+ error.Column + Environment.NewLine; msg += "[信息] "
+ error.ErrorText + Environment.NewLine; msg += Environment.NewLine; } MessageBox.Show(msg, "内置方法类编译错误"); } } #endregion } }}</span> |
类文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
DynamicReflection{ public
class Test { public
static string SayHello1() { return
"hello static method"; } public
string SayHello2() { return
"hello instance method"; } public
string SayHello3(string
args) { return
"hello args " + args; } }} |
原文地址:http://www.cnblogs.com/zhangqs008/p/3773735.html