`
justdoithz
  • 浏览: 48857 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

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

阅读更多
在软件开发尤其是框架和底层开发时,为了更灵活的控制代码,常常需要进行一些动态的操作。比如根据用户的输入等动态的调用类中的方法或者根据数据库表结构、用户要求动态的生成一些类,然后再动态的调用类中的方法。当然使用这些方式时会对性能有一点影响,具体使用过程中可以根据实际情况来定,不过一般的B/S开发中主要的瓶颈还是在数据库操作和网速方面,这点影响应该可以忽略的
下面我就从这两个方面来说说动态代码的使用:
一、反射的使用
可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
需要使用的命名空间:System.Reflection
反射的作用很多,下面的例子主要是看一下怎么动态的调用类中的方法。
例子类
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->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);
}

}

这个例子中提供了三个方法和一个属性,下面的代码来动态的调用它们:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->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});
}

}


MethodInfomMy
=t.GetMethod("MyWrite");
if(mMy!=null)
{
mMy.Invoke(obj,
newobject[]{strText});
}

BindingFlags用来设置要取得哪些类型的方法,然后我们就可以取得这些方法来动态的调用。(当然为了可以循环的调用方法,在方法的命名方面可以自己指定一个规则)

二、动态生成类
我们可以在程序运行过程中调用.NET中提供的编译类,动态的将一段string编译成一个类,然后再通过反射来调用它
需要使用的命名空间:System.CodeDom System.CodeDom.Compiler Microsoft.CSharp System.Reflection
动态创建、编译类的代码如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicstaticAssemblyNewAssembly()
{
//创建编译器实例。
provider=newCSharpCodeProvider();
//设置编译参数。
paras=newCompilerParameters();
paras.GenerateExecutable
=false;
paras.GenerateInMemory
=true;

//创建动态代码。
StringBuilderclassSource=newStringBuilder();
classSource.Append(
"publicclassDynamicClass\n");
classSource.Append(
"{\n");

//创建属性。
classSource.Append(propertyString("aaa"));
classSource.Append(propertyString(
"bbb"));
classSource.Append(propertyString(
"ccc"));

classSource.Append(
"}");

System.Diagnostics.Debug.WriteLine(classSource.ToString());

//编译代码。
CompilerResultsresult=provider.CompileAssemblyFromSource(paras,classSource.ToString());

//获取编译后的程序集。
Assemblyassembly=result.CompiledAssembly;

returnassembly;
}


privatestaticstringpropertyString(stringpropertyName)
{
StringBuildersbProperty
=newStringBuilder();
sbProperty.Append(
"privateint_"+propertyName+"=0;\n");
sbProperty.Append(
"publicint"+""+propertyName+"\n");
sbProperty.Append(
"{\n");
sbProperty.Append(
"get{return_"+propertyName+";}\n");
sbProperty.Append(
"set{_"+propertyName+"=value;}\n");
sbProperty.Append(
"}");
returnsbProperty.ToString();
}
propertyString方法就是用来拼写字符串的
整个代码比较简单,主要步骤就是:1、拼写类的字符串 2、调用CSharpCodeProvider类进行编译得到程序集(assembly)

接下来就可以利用之前反射的方法来动态调用这个类中的属性了:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->Assemblyassembly=NewAssembly();

objectClass1=assembly.CreateInstance("DynamicClass");
ReflectionSetProperty(Class1,
"aaa",10);
ReflectionGetProperty(Class1,
"aaa");

objectClass2=assembly.CreateInstance("DynamicClass");
ReflectionSetProperty(Class1,
"bbb",20);
ReflectionGetProperty(Class1,
"bbb");
DynamicClass是我动态类的类名,aaa和bbb是其中的属性
ReflectionSetProperty和ReflectionGetProperty代码如下:
给属性赋值
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->privatestaticvoidReflectionSetProperty(objectobjClass,stringpropertyName,intvalue)
{
PropertyInfo[]infos
=objClass.GetType().GetProperties();
foreach(PropertyInfoinfoininfos)
{
if(info.Name==propertyName&&info.CanWrite)
{
info.SetValue(objClass,value,
null);
}

}

}

取得属性的值
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->privatestaticvoidReflectionGetProperty(objectobjClass,stringpropertyName)
{
PropertyInfo[]infos
=objClass.GetType().GetProperties();
foreach(PropertyInfoinfoininfos)
{
if(info.Name==propertyName&&info.CanRead)
{
System.Console.WriteLine(info.GetValue(objClass,
null));
}

}

}
分享到:
评论

相关推荐

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

    在软件开发尤其是框架和底层开发时,为了更灵活的控制代码,常常需要进行一些动态的操作。比如根据用户的输入等动态的调用类中的方法或者根据数据库表结构、用户要求动态的生成一些类,然后再动态的调用类中的方法。

    JAVA项目代码绘制PDF和通过freemarker动态生成PDF

    不太推荐需要在代码内部编写PDF格式,如果要使用,建议写个基类,将同一版本 或者同一类型的公共方法写入,差异化的抽象,一个模板一个子类,子类使用@Component命名,使用反射的方式获取模板子类。 2. ...

    c# 生成动态菜单 委托 事件 反射 递归 源代码

    使用了如下 生成动态菜单 委托 事件 反射 递归 加载单击事件 配置文件 数据库为SQL2005 源代码 适合新手学习

    利用反射生成泛型类对象

    反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool&lt;Point&gt; pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...

    C#代码生成器(包括T-sql语句,和实体类代码)

    利用反射技术实现通过实体类生成DLL文件通过发射动态加载技术将实体类加载进来,并且读出所有公共属性转化成T-sql语句,并且还可以通过现有的数据库表动态生成实体类代码!

    Net代码生成器-自动生成代码,自动生成数据库文档

    主要实现在对应数据库中表的基类代码的自动生成,包括生成属性、添加、修改、删除、查询、存在性、Model 类构造等基础代码片断,支持不同3种架构代码生成,使程序员可以节省大量机械录入的时间和重复劳动,而将精力...

    Qt 使用QMetaObject实现反射机制代码demo

    Qt 使用QMetaObject实现反射机制代码demo

    .net 代码生成器

    动软.Net代码生成器Codematic 是一款为C#数据库程序员设计的自动代码生成器,Codematic 生成的代码基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想...

    Java动态生成代码并编译载入.pdf

    有时候需要在运行时根据模板和数据动态生成 Java 代码,然后对其进行编译生成 Class 文件,然后再将这些类加载 进去,并使用反射来创建对象。

    .NET代码生成插件源码

    动软.Net代码生成器Codematic 是一款为C#数据库程序员设计的自动代码生成器,Codematic 生成的代码基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想...

    动软代码生成器,可以一键生成数据字典等等

    也是一个软件项目智能开发平台,它可以生成基于面向对象的思想和三层架构设计的代码,结合了软件开发中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。主要实现在对应数据库中表的基类代码的自动生成...

    动软代码生成器工具2023

    也是一个软件项目智能开发平台,它可以生成基于面向对象的思想和三层架构设计的代码,结合了软件开发中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。主要实现在对应数据库中表的基类代码的自动生成...

    基于freemarker的JAVA代码生成工具

    根据数据库表直接生成Controller、model、service、mapper、mybatis的xml文件。 使用方法:加压下载文件,导入eclipse,项目中附了一份txt的说明文档

    基于C#的代码自动生成器

    先配置bin文件夹下面的config.ini文件,ConnStr表示连接的数据库,运行本工具,选择对应的表,点击生成代码,程序会根据数据库里面表的配置信息和字段类型,名称等信息结合template文件夹下面的模板文件生成相关代码...

    c++ 反射实现原理代码;

    c++ 反射实现原理代码;c++ 反射实现原理代码;c++ 反射实现原理代码;c++ 反射实现原理代码;c++ 反射实现原理代码;

    C# .Net代码生成器

    9.Net代码生成器Codematic 是一款为C#数据库程序员设计的自动代码生成器,Codematic 生成的代码基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。...

    动软代码生成器

    也是一个软件项目智能开发平台,它可以生成基于面向对象的思想和三层架构设计的代码,结合了软件开发中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。主要实现在对应数据库中表的基类代码的自动生成...

    c#三层架构代码生成器

    Codematic 是一款为 C# 数据库程序员设计的自动代码生成器,Codematic 生成的代码基于基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。采用 Model ...

    动软.Net代码生成器2.1版

    动软.Net代码生成器Codematic 是一款为C#数据库程序员设计的自动代码生成器,Codematic 生成的代码基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想...

    动软.Net代码自动生成器2.0

    动软.Net代码自动生成器Codematic 是一款为C#数据库程序员设计的自动代码生成器,生成的代码基于基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。...

Global site tag (gtag.js) - Google Analytics