思归呓语

衣带渐宽终不悔,为伊消得人憔悴
随笔 - 396, 评论 - 2964, 引用 - 245

导航

工具

关于

标签

每月存档

广告



访客

使用C# 4.0实现动态方法

了解动态语言Ruby的,大概都知道Ruby中有一个很有意思的实例方法叫method_missing。如果在代码中调用一个某个类中不存在的方法,就会调用这个方法。Ruby on Rails中的ActiveRecord利用这个方法,可以提供很方便的动态查询方法,譬如

find_by_name
find_by_username_and_password
find_all_by_first_name_and_last_name
....

细节请参考 http://www.gargoylesoftware.com/RailsDynamicFinders.pdf

当然,通过这个方法,你还可以做许多涉及metaprogramming的东西。

 

最近发布的C# 4.0 CTP版本引进了大量的动态语言的构造,我们终于也可以很方便地实现动态方法了,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Scripting.Actions;

namespace ConsoleApplication1
{
    class Data
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Value { get;set;}
    }

       //这里使用了CTP版本中IDynamic Object Example例程中的IDOHelper项目中的Dynamic类以减少代码量
    class MyClass : System.Scripting.Actions.Dynamic
    {
        List<Data> data;
        public MyClass()
        {
            data = new List<Data>{ new Data {ID=1,Name="abc",Value="hello world" },
                new Data {ID=2,Name="def",Value="hello joycode"},
            };
        }

        public string Find(int id)
        {
            if (id <= 0 || id > 2)
                throw new ArgumentException("cannot handle this parameter:" + id.ToString());

            return Find(d => d.ID == id);
        }

        public override object Call(CallAction action, params object[] args)
        {
            if (action.Name == "Find" || action.Name == "FindByID")
                return Find((int)args[0]);
            else if (action.Name == "FindByName")
                return Find(d => d.Name == (string)args[0]);

            //当然,在这里,你可以发挥想象力,实现任何你能想到的方法

             throw new NotSupportedException();
        }

         private string Find(Predicate<Data> p)
        {
            Data d = data.Find(p);
            if (d == null)
                return String.Empty;
            return d.Value;
        }
    }

}

在客户端代码里,你可以这样

dynamic m = new MyClass();


Console.WriteLine(m.Find(1)); //Find方法在类中有声明,但其实还是通过Call方法来调用的

Console.WriteLine(m.FindByID(2));  //但FindByID则没有声明

Console.WriteLine(m.FindByName("def")); //FindByName也没有声明

这里把m声明为dynamic是关键,否则会出错。输出为

hello world
hello joycode
hello joycode

 

微软的Chris Burrows对此有更深入的讨论:

C# "dynamic," Part II
http://blogs.msdn.com/cburrows/archive/2008/10/28/c-dynamic-part-ii.aspx

posted on 2008-10-31 17:19:55 by saucer  评论(2) 阅读(3350)

PDC 2008 录像

一些讲座的录像已经上线:

http://channel9.msdn.com/tags/pdc2008/

 

哎,想看的太多了,可是每个都是一个多小时。。。。

对C# 4.0感兴趣的,一定要看一下的Anders Hejlsberg的

The Future of C#
http://channel9.msdn.com/pdc2008/TL16/

posted on 2008-10-31 00:01:25 by saucer  评论(0) 阅读(3522)

应用架构指引第二版beta

微软模式和实践团队已经推出了《应用架构指引》(第二版)的beta 1版本

patterns & practices Application Architecture Guide - v2.0 (Beta 1 Release)
http://www.codeplex.com/AppArchGuide

PDF版本可在此下载

http://www.codeplex.com/AppArchGuide/Release/ProjectReleases.aspx?ReleaseId=18834

 

在知道微软即将推出《应用架构指引》的第二版时,我即有意将该书翻译成中文。博文视点在了解情况后,很快与微软出版社取得联系,得到了该书的版权。在明知微软将免费提供该书英文版的情形下依然愿意出版该书,这样的胸襟非常难得,在此特向博文视点表示敬意。我计划从beta 1翻译起,希望在正式版(大概在1月中旬左右)推出不久,就能完成该书的翻译。

自四月份起,连续做了N个项目,忙得不行,到现在,虽然还有不少收尾工作,但终于有些空余时间了。适逢微软推出了无数新技术,其热闹程度,感觉象是到了春天一样,可玩的东西真是太多了,Silverlight 2, Visual Studio 2010, .NET 4, Windows 7, Windows Azure,  Windows Office Live, Oslo 和 M 语言,...Happy days are here again!

posted on 2008-10-29 05:44:02 by saucer  评论(1) 阅读(2615)

Visual Studio 2010 和 .NET Framework 4.0 CTP版

微软刚发布了Visual Studio 2010 和 .NET Framework 4.0 CTP版

Microsoft Pre-release Software Visual Studio 2010 and .NET Framework 4.0 Community Technology Preview (CTP)
http://www.microsoft.com/downloads/details.aspx?FamilyID=922b4655-93d0-4476-bda4-94cf5f8d4814&DisplayLang=en

目前只提供英文版的VPC映像,系统要求很高,譬如最少75G的硬盘空间,最少2G的RAM。

posted on 2008-10-28 01:51:23 by saucer  评论(0) 阅读(2733)

Powered by: Joycode MVC Blogger System