专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » 代码生成器:动态代码的使用(反射和动态生成类) »正文

代码生成器:动态代码的使用(反射和动态生成类)

来源: 发布时间:星期三, 2008年9月10日 浏览:204次 评论:0
在软件开发尤其是框架和底层开发时,为了更灵活的控制代码,常常需要进行一些动态的操作。比如根据用户的输入等动态的调用类中的方法或者根据数据库表结构、用户要求动态的生成一些类,然后再动态的调用类中的方法。当然使用这些方式时会对性能有一点影响,具体使用过程中可以根据实际情况来定,不过一般的B/S开发中主要的瓶颈还是在数据库操作和网速方面,这点影响应该可以忽略的
一、反射的使用
可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
需要使用的命名空间:System.Reflection
反射的作用很多,下面的例子主要是看一下怎么动态的调用类中的方法。
例子类
classReflTest1
{
privatestring_prop1;

publicstringProp1
{
get{return_prop1;}
set{_prop1=value;}
}

publicvoidWrite1(stringstrText)
{
Console.WriteLine(\"111111111:\"+strText);
}
publicvoidWrite2(stringstrText)
{
Console.WriteLine(\"222222222:\"+strText);
}
publicvoidMyWrite(stringstrText)
{
Console.WriteLine(\"3333333333:\"+strText);
}
}
这个例子中提供了三个方法和一个属性,下面的代码来动态的调用它们:
stringstrText=\"abcd\";

BindingFlagsflags=(BindingFlags.NonPublic|BindingFlags.Public|
BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly);

Typet=typeof(ReflTest1);
MethodInfo[]mi=t.GetMethods(flags);
Objectobj=Activator.CreateInstance(t);

foreach(MethodInfominmi)
{
if(m.Name.StartsWith(\"Write\"))
{
m.Invoke(obj,newobject[]{strText});
} [Page]
}

MethodInfomMy=t.GetMethod(\"MyWrite\");
if(mMy!=null)
{
mMy.Invoke(obj,newobject[]{strText});
}
BindingFlags用来设置要取得哪些类型的方法,然后我们就可以取得这些方法来动态的调用。(当然为了可以循环的调用方法,在方法的命名方面可以自己指定一个规则)

二、动态生成类
我们可以在程序运行过程中调用.NET中提供的编译类,动态的将一段string编译成一个类,然后再通过反射来调用它
需要使用的命名空间:System.CodeDomSystem.CodeDom.CompilerMicrosoft.CSharpSystem.Reflection

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: