运行时编译执行代码的又一应用, 仅供娱乐

    之前写的那篇<<一个极其简单的在线C#IDE例子>>, 貌似很合大众胃口.这次我又想到一个种运行时编译执行代码的应用, 不过比较简单就是.

    比如Math.dll程序集有个计算器的类

namespace Account
{
    
/// <summary>
    
/// 计算器
    
/// </summary>

    public class Calcualtor
    
{
        
public int Add(int x, int y)
        
{
            
return x + y;
        }

    }

}


    现在我们的程序当中, 要使用计算器的功能.但是我们还并没有具体的Calcualtor类, 所以我们用一个接口来表示:

    /// <summary>
    
/// 计算器接口
    
/// </summary>

    public interface ICalculator
    
{
        
int Add(int x, int y);
    }


    在依赖注入中,经常会这么做.但是,这时候的Calcualtor类并没有实现ICalcualtor这个接口.怎么办?看测试:

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestDynamicObjectPool
{
    
/// <summary>
    
/// 计算器接口
    
/// </summary>

    public interface ICalculator
    
{
        
int Add(int x, int y);
    }


    [TestClass()]
    
public class DynamicObjectPoolTest
    
{
        [TestMethod()]
        
public void GetInstanceTest()
        
{
            
//参数按顺序为:目标类程序集,目标类Namespace,目标类名,所依赖的其它程序集(这里为测试自身程序集)
            ICalculator proxy = DynamicObject.GetObject<ICalculator>("Account""Account""Calcualtor""TestDynamicObjectPool.dll");
            Assert.AreEqual(
2, proxy.Add(11));
        }

    }

}

    使用ICalculator就可以调用到Calculator类的方法实现了.
    实现的原理很土很简单, 就是动态生成一个代理类:

using System;
using System.Collections.Generic;

namespace DynamicProxy
{
    
public class CalcualtorProxy : Account.Calcualtor, TestDynamicObjectPool.ICalcualtor { }
}

    这种方法的拘束很大, 比如目标类必需可以被继承,要有无参构造函数等.这里纯粹是说个想法, 仅供娱乐.

   完整代码下载 : DynamicObjectPool.rar

posted on 2008-05-06 23:12 xiaosonl 阅读(1570) 评论(6)  编辑 收藏 网摘 所属分类: .NET

评论

#1楼 2008-05-07 00:04 csulonely      

沙发?
沙发!!
呵呵!!
还是看文章吧!
  回复  引用  查看    

#2楼 2008-05-07 00:36 镜涛      

不错   回复  引用  查看    

#3楼 2008-05-07 11:15 玉开      

我怎么没看到运行时编译呀?   回复  引用  查看    

#4楼[楼主] 2008-05-07 11:27 xiaosonl      

在下载的完整代码里
也可以参照这篇文章<<一个极其简单的在线C#IDE例子>>http://www.cnblogs.com/xiaosonl/archive/2008/05/05/1184021.html" target="_new">http://www.cnblogs.com/xiaosonl/archive/2008/05/05/1184021.html
  回复  引用  查看    

#5楼 2008-05-07 14:13 代码乱了      

这明明是动态代理嘛,呵呵   回复  引用  查看    

#6楼 2008-06-29 19:18 lexus      

不错,学习了   回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1185952




相关文章:

相关链接:

导航

<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

与我联系

搜索

 

常用链接

留言簿

我参与的团队

我的标签

随笔分类

随笔档案

文章分类

相册

推荐博客

最新评论

阅读排行榜

评论排行榜