VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • c#4.0中动态类型和动态编程

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  随着WEB开发的大行其道,各种动态语言也借着这股东风,蓬勃发展起来。在软件开发界,动态语言正在被越来越多的的人所接受和使用,在CSDN所做的2007年读者大调查中,动态语言在开发人群中的受关注程度竟然达到12%。而在 TIOBE的排名中,动态语言竟然占有了前十名中的六个席位(包括PHP、Python、Perl和 javascript,在加上越来越动态的Java和C#)。

  “未来属于动态语言”似乎正在从一个预言成为一个现实。C#自然不会错过这种技术发展确实,她正在通过不断引入新的动态预言的特性,使自己变得越来越美丽“动”人。

  C# 4.0的主题就是动态编程(Dynamic Programming)。虽然C#仍然是一种静态预言,但是对象的意义开始变得越来越“动态”。它们的结构和行为无法通过静态类型来捕获,或者至少编译器在编译程序时无法得知对象的结构和行为。

  C#引入了一种新的静态类型”dynamic”,当你拥有了一个dynamic类型的对象后,你“对它做的事情”只会在运行时进行解析。设想我们拥有这样两个类,分别表示两种饮料:

public class Coffee
  {
    public string GetName()
    {
      return "You selected Maxwell coffee.";
    }
  }
  public class Juice
  {
    public string GetName()
    {
      return "You selected orange juice.";
    }
  }

  现在,我们就可以用dynamic类型来表示这两种饮料。我们写一个函数GetDrink(),更加用户不同的选择返回不同的对象。

static private Object GetDrink(int i)
{
      if (i == 1)
      {
        return new Juice();
      }
      else // default
      {
        return new Coffee();
      }
}
static void Main(string[] args)
{
      Console.WriteLine("Please Select Your Drink: 1 -- Juice; 2 -- Coffee");
      int nDrinkType = Console.Read();
      dynamic drink = GetDrink( nDrinkType );
      Console.WriteLine( drink.GetName() );
}

 

  C#编译器允许你通过dynamic对象调用任何方法,即使这个方法根本不存在,编译器也不会在编译的时候报编译错误。只有在运行的时候,它才会检查这个对象的实际类型,并检查在它上面GetName()是什么意思。动态类型将使得C#可以以更加统一而便利的形式范围下列对象:

  •a. 来自动态编程语言——如Python或Ruby——的对象

  •b. 通过IDispatch访问的COM对象

  •c. 通过反射访问的一般.NET类型

  •d. 结构发生过变化的对象——如HTML DOM对象

  当我们得到一个动态类型的对象时,不管它是来自COM还是IronPython、HTML DOM还是反射,只需要对其进行操作即可,动态语言运行时(DLR)会帮我们指出针对特定的对象,这些操作的具体意义。这将给我们的开发带来极大的灵活性,并且能够极大程度上地精简我们的代码。

  下面,我们就以一个具体实例SilverlightSolution,来演示C# 4.0中的动态编程是如何简化对Silverlight应用程序中HTML DOM对象的访问的。

  1.安装Silverlight 2运行时和SDK

  为了运行这个实例,我们需要安装Silverlight 2运行时和SDK。这些都可以从微软的网站上直接下载:

  Silverlight 2 RTW runtime

  Silverlight 2 RTW SDK

  另外,因为Visual Studio 2010跟Silverlight的一些已知的兼容性问题,我们还需要一个拥有管理员权限的账号来运行Visual Studio 2010 CTP。

  2.下载实例项目SilverlightSolution

  为了演示C# 4.0的诸多新特性,微软通过MSDN Code Gallery发布了一个演示C#新特性的实例程序包,我们用到的实例项目SilverlightSolution就在这个程序包中。我们可以访问:

  http://code.msdn.microsoft.com/csharpfuture

 

  下载这个实例程序包,然后将我们需要的项目SilverlightSolution解压到C盘根目录下。

  3.编译并运行实例项目

  我们用管理员身份启动Visual Studio CTP,然后打开SilverlightSolution项目,如果一切正常,我们可以得到一个空的Silverlight程序页面:

C# 4.0中的动态类型和动态编程

  图1 初始页面

  4.添加对HTML DOM对象的动态访问

  我们在Page类中添加两个dynamic类型的对象doc和win,分别表示当前页面和窗口,修改后Page类如下:

public partial class Page : UserControl
    {
    // 添加的代码
      dynamic doc = HtmlPage.Document.AsDynamic();
      dynamic win = HtmlPage.Window.AsDynamic();
    //…
}

  然后,我们修改Page类的函数btnSearch_Click(),当用户点击”Get All”按钮后,更加用户搜索的内容,修改窗口的标题。

void btnSearch_Click(object sender, RoutedEventArgs e)
    {
        doc.Title = "Pictures of " + txtTag.Text;
        lstPictures.ItemsSource = Source.LoadItems();
    }

  5.添加Virtual Earth Jscript控件

  打开解决方案中的测试页StartPage.htm,在<title>标签的前面添加如下Jave Script代码,引用Virtual Earth控件:

<script type="text/javascript" src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1"/>

 

  然后,在<body>标签中添加如下代码,定义地图控件的位置和大小:

<div id='myMap' style="position:absolute; top:40px; left:200px; width:550px; height:400px;"/>

  通过简单的两步,我们就完成了对测试页面的修改。接下来的工作就是通过C#访问和控制Virtual Earth控件了。

  6.用C#代码控制Virtual Earth控件

  在Page类中添加如下代码控制Virtual Earth控件,以实现获取地图,添加Pin的功能:

dynamic map = null;
    void GetMap()
    {
        map = win.New.VEMap("myMap");
        map.LoadMap();
    }
    void AddPin(Item item)
    {
        dynamic loc = win.New.VELatLong(item.Latitude, item.Longitude);
        var pin = map.AddPushpin(loc);
        pin.SetTitle(item.Title);
        pin.SetDescription(item.Description);
        map.SetCenterAndZoom(loc, 7);
    }

  忆苦才能思甜。为了体会动态编程给我们带来的便利,我们来看看在没有动态类型的C# 3.0中,AddPin()函数应该如何实现。如果是在C# 3.0中,我们的doc,win和map 都将是静态类型,为了执行这些对象的某些方法,需要进行显式的类型转换,同时,还需要将方法名作为字符串传递以实现方法的调用。很明显,C# 3.0中的实现过程非常繁琐,而C# 4.0中的实现是如此的优雅而自然。

void AddPin(Item item)
 {
ScriptObject loc = win.CreateInstance("VELatLong", item.Latitude, item.Longitude);
ScriptObject pin = (ScriptObject)map.Invoke("AddPushpin", loc);
pin.Invoke("SetTitle", item.Title);
pin.Invoke("SetDescription", item.Description);
map.Invoke("SetCenterAndZoom", loc, 7);
}

 

  最后,我们需要在适当的位置调用这两个函数,以实现地图的加载和Pin的添加。在Page类的Init()函数中添加GetMap()函数调用:

public void Init()
{
     GetMap();
}

  另外,在lstPictures_SelectionChanged()函数中添加AddPin()函数,当用户选择的图片变化后,重新获取Pin的位置并添加到地图上:

void lstPictures_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
     Item selected = lstPictures.SelectedItem as Item;
     AddPin(selected);
}

  7.编译解决方案

  到这里为止,我们对项目的修改就全部完成了。重新编译整个解决方案,我们可以看到添加Virtual Earth控件后的页面。当我们在左侧列表中选择图片后,Pin会定位到这幅图片拍摄的地点,当我们把鼠标移动到Pin上时,则会显示图片和更多的相关信息。

C# 4.0中的动态类型和动态编程

  图2 添加Virtual Earth控件后的页面

 

 

  C#编译器允许你通过dynamic对象调用任何方法,即使这个方法根本不存在,编译器也不会在编译的时候报编译错误。只有在运行的时候,它才会检查这个对象的实际类型,并检查在它上面GetName()是什么意思。动态类型将使得C#可以以更加统一而便利的形式范围下列对象:

  •a. 来自动态编程语言——如Python或Ruby——的对象

  •b. 通过IDispatch访问的COM对象

  •c. 通过反射访问的一般.NET类型

  •d. 结构发生过变化的对象——如HTML DOM对象

  当我们得到一个动态类型的对象时,不管它是来自COM还是IronPython、HTML DOM还是反射,只需要对其进行操作即可,动态语言运行时(DLR)会帮我们指出针对特定的对象,这些操作的具体意义。这将给我们的开发带来极大的灵活性,并且能够极大程度上地精简我们的代码。

  下面,我们就以一个具体实例SilverlightSolution,来演示C# 4.0中的动态编程是如何简化对Silverlight应用程序中HTML DOM对象的访问的。

  1.安装Silverlight 2运行时和SDK

  为了运行这个实例,我们需要安装Silverlight 2运行时和SDK。这些都可以从微软的网站上直接下载:

  Silverlight 2 RTW runtime

  Silverlight 2 RTW SDK

  另外,因为Visual Studio 2010跟Silverlight的一些已知的兼容性问题,我们还需要一个拥有管理员权限的账号来运行Visual Studio 2010 CTP。

  2.下载实例项目SilverlightSolution

  为了演示C# 4.0的诸多新特性,微软通过MSDN Code Gallery发布了一个演示C#新特性的实例程序包,我们用到的实例项目SilverlightSolution就在这个程序包中。我们可以访问:

  http://code.msdn.microsoft.com/csharpfuture



相关教程