zoukankan
html css js c++ java
c# 反射总结
Code
http:
//
blog.csdn.net/xiaolei1982/archive/2008/04/15/2294364.aspx
首先我们建立一个类库,将它生成为HelloWorld.dll,
using
System;
namespace
Webtest
{
public
interface
interface1
{
int
add();
}
public
class
ReflectTest : interface1
{
public
string
Write;
private
string
Writec;
public
string
Writea
{
get
{
return
this
.Write;}
set
{
this
.Write
=
value; }
}
public
string
Writeb
{
get
{
return
this
.Writec; }
set
{
this
.Writec
=
value; }
}
public
ReflectTest()
{
this
.Write
=
"
Write
"
;
this
.Writec
=
"
Writec
"
;
}
public
ReflectTest(
string
str1,
string
str2)
{
this
.Write
=
str1;
this
.Writec
=
str2;
}
public
string
WriteString(
string
s,
int
b)
{
return
"
欢迎你,
"
+
s
+
"
--
"
+
b;
}
public
static
string
WriteName(
string
s)
{
return
"
欢迎你:
"
+
s;
}
public
string
WriteNoParam()
{
return
"
你使用的是无参数的方法!
"
;
}
private
string
WritePrivate()
{
return
"
私有类型的方法!
"
;
}
public
int
add()
{
return
5
;
}
}
}
然后,建立再建立一个项目引入该HelloWorld.dll,
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Reflection;
namespace
Refltest
{
class
Program
{
delegate
string
TestDelegate(
string
value,
int
value1);
static
void
printf()
{
Console.WriteLine(
"
******************************************************
"
);
}
static
void
Main()
{
//
Assembly t = Assembly.LoadFrom("HelloWorld.dll"); 与下面相同的效果
Assembly t
=
Assembly.Load(
"
HelloWorld
"
);
//
调用程序集
//
**********************************************************************
printf();
foreach
(Type aaa
in
t.GetTypes())
{
Console.WriteLine(
"
dll下的类:
"
+
aaa.Name);
//
显示该dll下所有的类
}
//
**********************************************************************
printf();
Module[] modules
=
t.GetModules();
//
??????
foreach
(Module module
in
modules)
{
Console.WriteLine(
"
module name:
"
+
module.Name);
//
显示模块的名字本例为"HelloWorld.dll"
}
//
**********************************************************************
printf();
Type a
=
typeof
(Webtest.ReflectTest);
//
得到具体的类的类型,和下面一个效果
Type a_a
=
t.GetType(
"
Webtest.ReflectTest
"
);
//
Console.WriteLine(a.Name);
//
输出类名
Console.WriteLine(a_a.Name);
//
**********************************************************************
printf();
string
[] bb
=
{
"
aaaa
"
,
"
bbbbb
"
}
;
object
obj
=
Activator.CreateInstance(a,bb);
//
创建该类的实例,后面的bb为有参构造函数的参数,a为类型,有默认参数
object
_obj
=
t.CreateInstance(
"
Webtest.ReflectTest
"
);
//
与上面方法相同,无默认参数
Console.WriteLine(((Webtest.ReflectTest)obj).Writea);
Console.WriteLine(((Webtest.ReflectTest)_obj).Writea);
//
**********************************************************************
printf();
MethodInfo[] miArr
=
a.GetMethods();
//
显示公共方法
foreach
(MethodInfo mi0
in
miArr)
{
Console.WriteLine(
"
method:
"
+
mi0.Name);
//
显示所有的共有方法
}
//
**********************************************************************
printf();
MethodInfo mi
=
a.GetMethod(
"
WriteString
"
);
//
显示具体的方法,获取具体的方法
object
[] aa
=
{
"
使用的是带有参数的非静态方法
"
,
2
}
;
string
s
=
(
string
)mi.Invoke(obj,aa);
//
带参数方法的调用,obj是类的实例,aa是参数
Console.WriteLine(
"
s=
"
+
s);
MethodInfo mi1
=
a.GetMethod(
"
WriteName
"
);
String[] aa1
=
{
"
使用的是静态方法
"
}
;
string
s1
=
(
string
)mi1.Invoke(
null
, aa1);
//
静态方法的调用,不用实例
Console.WriteLine(
"
s1=
"
+
s1);
MethodInfo mi2
=
a.GetMethod(
"
WriteNoParam
"
);
string
s2
=
(
string
)mi2.Invoke(obj,
null
);
//
不带参数的方法调用
Console.WriteLine(
"
s2=
"
+
s2);
MethodInfo mi3
=
a.GetMethod(
"
WritePrivate
"
,BindingFlags.Instance
|
BindingFlags.NonPublic);
string
s3
=
(
string
)mi3.Invoke(obj,
null
);
//
私有类型方法调用
Console.WriteLine(
"
s3=
"
+
s3);
//
**********************************************************************
printf();
PropertyInfo[] piArr
=
a.GetProperties(BindingFlags.Instance
|
BindingFlags.NonPublic
|
BindingFlags.Public);
foreach
(PropertyInfo pi
in
piArr)
{
Console.WriteLine(
"
属性:
"
+
pi.Name);
//
显示所有的属性
}
//
**********************************************************************
printf();
PropertyInfo pi1
=
a.GetProperty(
"
Writea
"
);
//
pi1.SetValue(obj, "Writea", null);
Console.WriteLine(pi1.GetValue(obj,
null
));
PropertyInfo pi2
=
a.GetProperty(
"
Writeb
"
, BindingFlags.Instance
|
BindingFlags.NonPublic
|
BindingFlags.Public);
pi2.SetValue(obj,
"
Writeb
"
,
null
);
//
Console.Write(pi2.GetValue(obj, null));
FieldInfo fi1
=
a.GetField(
"
Write
"
);
Console.WriteLine(fi1.GetValue(obj));
//
**********************************************************************
printf();
ConstructorInfo[] ci1
=
a.GetConstructors();
foreach
(ConstructorInfo ci
in
ci1)
{
Console.WriteLine(
"
构造函数:
"
+
ci.ToString());
//
获得构造函数的形式
}
ConstructorInfo asCI
=
a.GetConstructor(
new
Type[]
{
typeof
(
string
),
typeof
(
string
) }
);
Console.WriteLine(
"
特定的构造函数:
"
+
asCI.ToString());
//
**********************************************************************
printf();
Webtest.interface1 obj1
=
(Webtest.interface1)t.CreateInstance(
"
Webtest.ReflectTest
"
);
Webtest.ReflectTest obj2
=
(Webtest.ReflectTest)t.CreateInstance(
"
Webtest.ReflectTest
"
);
Console.WriteLine(
"
Factory_interface:
"
+
obj1.add());
//
典型的工厂模式
Console.WriteLine(
"
Factory_Class:
"
+
obj2.add());
//
**********************************************************************
printf();
foreach
(Type tt
in
t.GetTypes())
{
if
(tt.GetInterface(
"
interface1
"
)
!=
null
)
//
判断是否继承接口interface1
{
Webtest.interface1 obj3
=
(Webtest.interface1)Activator.CreateInstance(a);
//
a 类的类型,实例对象
Console.WriteLine(obj3.add());
//
???
}
}
//
**********************************************************************
printf();
TestDelegate method
=
(TestDelegate)Delegate.CreateDelegate(
typeof
(TestDelegate), obj,
"
WriteString
"
);
//
动态创建委托的简单例子
Console.WriteLine(
"
委托:
"
+
method(
"
str1
"
,
2
));
//
**********************************************************************
printf();
ConstructorInfo asCI1
=
a.GetConstructor(
new
Type[
0
]);
Webtest.ReflectTest obj5
=
(Webtest.ReflectTest)asCI1.Invoke(
null
);
//
通过无参构造函数实例化的方法
Console.Write(obj5.Writea);
ConstructorInfo asCI2
=
a.GetConstructor(
new
Type[]
{
typeof
(
string
),
typeof
(
string
) }
);
//
通过有参构造函数实例化的方法
Webtest.ReflectTest obj6
=
(Webtest.ReflectTest)asCI2.Invoke(bb);
Console.Write(obj6.Writea);
//
**********************************************************************
Console.Read();
}
}
}
查看全文
相关阅读:
[LeetCode] Max Area of Island
[TCP/IP] TCP数据报
[LeetCode] Number of Islands
[LeetCode] Binary Number with Alternating Bits
[TCP/IP] Internet协议
[LeetCode] Isomorphic Strings
[LeetCode] Path Sum
[LeetCode] Count and Say
[学习OpenCV攻略][001][Ubuntu安装及配置]
[国嵌攻略][038][时钟初始化]
原文地址:https://www.cnblogs.com/binlyzhuo/p/1500191.html
最新文章
python 继承进阶
继承和组合
python 初始面向对象
python正则以及collections模块
python(时间模块,序列化模块等)
python (面向对象相关的三个模块)
常用模块
python 函数和方法的区别
HNCU1323: 算法2-1:集合union
HDU1276士兵队列训练问题 循环队列
热门文章
第一个c语言小程序。
hdu1061 Rightmost Digit 快速幂的简单应用
TJU1188Tian Ji -- The Horse Racing田忌赛马
TJU 1398 Square DFS
hdu1426数独游戏Sudoku Killer DFS
hdu1172猜数字
序号互换
随机生成数据 文件数据的输入输出
[Operating System] 进程
[Operating System] 操作系统
Copyright © 2011-2022 走看看