C#强化系列文章五:动态代码的使用(反射和动态生成类)

简介:
在软件开发尤其是框架和底层开发时,为了更灵活的控制代码,常常需要进行一些动态的操作。比如根据用户的输入等动态的调用类中的方法或者根据数据库表结构、用户要求动态的生成一些类,然后再动态的调用类中的方法。当然使用这些方式时会对性能有一点影响,具体使用过程中可以根据实际情况来定,不过一般的B/S开发中主要的瓶颈还是在数据库操作和网速方面,这点影响应该可以忽略的
下面我就从这两个方面来说说动态代码的使用:
一、反射的使用
可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
需要使用的命名空间: System.Reflection
反射的作用很多,下面的例子主要是看一下怎么动态的调用类中的方法。
例子类
这个例子中提供了三个方法和一个属性,下面的代码来动态的调用它们:
             string  strText  =   " abcd " ;

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

            Type t 
=   typeof (ReflTest1);
            MethodInfo[] mi 
=  t.GetMethods(flags);
            Object obj 
=  Activator.CreateInstance(t);

            
foreach  (MethodInfo m  in  mi)
            
{
                
if (m.Name.StartsWith("Write"))
                
{
                    m.Invoke(obj, 
new object[] { strText });
                }

            }


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

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

二、动态生成类
我们可以在程序运行过程中调用.NET中提供的编译类,动态的将一段string编译成一个类,然后再通过反射来调用它
需要使用的命名空间: System.CodeDom System.CodeDom.Compiler Microsoft.CSharp System.Reflection
动态创建、编译类的代码如下:
         public   static  Assembly NewAssembly()
        
{
            
//创建编译器实例。   
            provider = new CSharpCodeProvider();
            
//设置编译参数。   
            paras = new CompilerParameters();
            paras.GenerateExecutable 
= false;
            paras.GenerateInMemory 
= true;

            
//创建动态代码。   
            StringBuilder classSource = new StringBuilder();
            classSource.Append(
"public   class   DynamicClass \n");
            classSource.Append(
"{\n");

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

            classSource.Append(
"}");

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

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

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

            
return assembly;
        }


        
private   static   string  propertyString( string  propertyName)
        
{
            StringBuilder sbProperty 
= new StringBuilder();
            sbProperty.Append(
" private   int   _" + propertyName + "   =   0;\n");
            sbProperty.Append(
" public   int   " + "" + propertyName + "\n");
            sbProperty.Append(
" {\n");
            sbProperty.Append(
" get{   return   _" + propertyName + ";}   \n");
            sbProperty.Append(
" set{   _" + propertyName + "   =   value;   }\n");
            sbProperty.Append(
" }");
            
return sbProperty.ToString();
        }
propertyString方法就是用来拼写字符串的
整个代码比较简单,主要步骤就是:1、拼写类的字符串  2、调用CSharpCodeProvider类进行编译得到程序集(assembly)

接下来就可以利用之前反射的方法来动态调用这个类中的属性了:
            Assembly assembly  =  NewAssembly();

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

            
object  Class2  =  assembly.CreateInstance( " DynamicClass " );
            ReflectionSetProperty(Class1, 
" bbb " 20 );
            ReflectionGetProperty(Class1, 
" bbb " );
DynamicClass是我动态类的类名,aaa和bbb是其中的属性
ReflectionSetProperty和ReflectionGetProperty代码如下:
给属性赋值

取得属性的值




    本文转自永春博客园博客,原文链接:http://www.cnblogs.com/firstyi/archive/2008/03/07/1094652.html,如需转载请自行联系原作者


相关文章
|
2月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
117 2
|
2月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
3月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
83 2
|
2月前
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
85 2
|
2月前
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
41 0
|
2月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
13 0
|
3月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
27 2
|
4月前
|
物联网 C# Windows
看看如何使用 C# 代码让 MQTT 进行完美通信
看看如何使用 C# 代码让 MQTT 进行完美通信
612 0
|
4月前
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
54 0
|
4月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
108 0