C#反射知识
来源:互联网 发布:盛世景 知乎 编辑:程序博客网 时间:2024/05/21 04:20
2、 命名空间与装配件的关系
3、 运行期得到类型信息有什么用
4、 如何使用反射获取类型
5、 如何根据类型来动态创建对象
6、 如何获取方法以及动态调用方法
7、 动态创建委托
Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。
诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。
2、命名空间与装配件的关系
装配件A:
- namespace
N1 - {
-
class AC1 {…} -
class AC2 {…} - }
- namespace
N2 - {
-
class AC3 {…} -
class AC4{…} - }
- 装配件B:
- namespace
N1 - {
-
class BC1 {…} -
class BC2 {…} - }
- namespace
N2 - {
-
class BC3 {…} -
class BC4{…} - }
有兴趣的话,接着往下看吧。
3、运行期得到类型信息有什么用
这就是个见仁见智的问题了,就跟早绑定和晚绑定一样,应用到不同的场合。有的人反对晚绑定,理由是损耗效率,但是很多人在享受虚函数带来的好处的时侯还没有意识到他已经用上了晚绑定。这个问题说开去,不是三言两语能讲清楚的,所以就点到为止了。
接着说,运行期得到类型信息到底有什么用呢?
还是举个例子来说明,很多软件开发者喜欢在自己的软件中留下一些接口,其他人可以编写一些插件来扩充软件的功能,比如我有一个媒体播放器,我希望以后可以很方便的扩展识别的格式,那么我声明一个接口:
- public
interface IMediaFormat - {
- string
Extension {get;} - Decoder
GetDecoder(); - }
这个接口中包含一个Extension属性,这个属性返回支持的扩展名,另一个方法返回一个解码器的对象(这里我假设了一个Decoder的类,这个类提供把文件流解码的功能,扩展插件可以派生之),通过解码器对象我就可以解释文件流。
那么我规定所有的解码插件都必须派生一个解码器,并且实现这个接口,在GetDecoder方法中返回解码器对象,并且将其类型的名称配置到我的配置文件里面。
这样的话,我就不需要在开发播放器的时侯知道将来扩展的格式的类型,只需要从配置文件中获取现在所有解码器的类型名称,而动态的创建媒体格式的对象,将其转换为IMediaFormat接口来使用。
这就是一个反射的典型应用。
4、如何使用反射获取类型
- …
- public
void Process( objectprocessObj ) - {
- Type
t = processsObj.GetType(); - if(
t.GetInterface(“ITest”) null!= ) -
… - }
- …
Type.GetType(“System.Data.DataTable”)就只能得到空引用。
Type t =Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089");
5、如何根据类型来动态创建对象
Type t =Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089");
DataTable table = (DataTable)Activator.CreateInstance(t);
- namespace
TestSpace -
{ -
class TestClass -
{ -
string _value; -
TestClass( stringvalue) -
{ -
_value=value; -
} -
} - }
- …
- Type
t = Type.GetType(“TestSpace.TestClass”); - Object[]
constructParms new= object[] {“hello”}; //构造器参数 - TestClass
obj = (TestClass)Activator.CreateInstance(t,constructParms); - …
把参数按照顺序放入一个Object数组中即可
6、如何获取方法以及动态调用方法
- namespace
TestSpace - {
-
public class TestClass { -
private string _value; -
public TestClass() { -
} -
public TestClass(string value) { -
= value; -
} -
-
public string GetValue( string prefix ) { -
if( ) -
return "NULL"; -
else -
return prefix+" : "+_value; -
} -
-
public string Value { - set
{ - _value=value;
- }
- get
{ - if(
_value==null ) - return
"NULL"; - else
- return
_value; - }
-
} -
} - }
上面是一个简单的类,包含一个有参数的构造器,一个GetValue的方法,一个Value属性,我们可以通过方法的名称来得到方法并且调用之,如:
//获取类型信息
Type t = Type.GetType("TestSpace.TestClass");
//构造器的参数
object[] constuctParms = new object[]{"timmy"};
//根据类型创建对象
object dObj = Activator.CreateInstance(t,constuctParms);
//获取方法的信息
MethodInfo method = t.GetMethod("GetValue");
//调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
BindingFlags flag = BindingFlags.Public |BindingFlags.Instance;
//GetValue方法的参数
object[] parameters = new object[]{"Hello"};
//调用方法,用一个object接收返回值
object returnValue =method.Invoke(dObj,flag,Type.DefaultBinder,parameters,null);
7、动态创建委托
- namespace
TestSpace { -
string TestDelegate( stringvalue); -
class TestClass { - public
TestClass() { -
} -
void GetValue( stringvalue) { -
value; -
} -
} - }
使用示例:
TestClass obj = new TestClass();
//获取类型,实际上这里也可以直接用typeof来获取类型
Type t = Type.GetType(“TestSpace.TestClass”);
//创建代理,传入类型、创建代理的对象以及方法名称
TestDelegate method =(TestDelegate)Delegate.CreateDelegate(t,obj,”GetValue”);
String returnValue = method(“hello”);
- C#中的反射知识
- C# 反射入门知识
- C# 反射入门知识
- C# 反射入门知识
- C# 反射入门知识
- C# 反射入门知识
- C# 反射入门知识
- C# 反射入门知识
- C# 反射入门知识
- c#反射入门知识
- C# 反射入门知识
- C# 反射入门知识
- C#反射知识
- C#反射知识
- C# 反射入门知识
- c#反射知识整理
- C#反射相关知识学习
- C# 反射入门知识(转)lei_captain
- C#判断一个string是否为数字(正则…
- c#用正则表达式判断字符串是否全是…
- C#中判断是否为数字(及一些好用的…
- asp.net DropDownList 选取选中事…
- 如何处理RadioButtonList中过长的…
- C#反射知识
- 开源框架:快速反射类库(Fast Ref…
- (收藏)C#开源资源大汇总
- .NET 软件版本号规定原则
- Code Review(代码复查)
- 正则表达式的基本语法
- 网络负载平衡的工作原理 负载均衡-…
- IBatisNet 开发指南系列文章更新
- 少用且有用的SQL语句【收藏】