C#4.0出来后,我打算用dynamic关键字重写以前的一个问题。
问题是这样的。
首先我编写好了一个程序集ShowAnimals.dll,它包含了五种动物类,每种动物类都有一个ShowAnimal()函数,可以绘制出相应的图片。
现在程序中有一个下拉式列表框(如图所示),里面列举了五种动物,用户选择一种动物,就显示该动物的图案。由于我们事先不知道用户会选择哪种动物,所以我们需要根据用户的选择结果动态加载相应的动物类,然后调用该动物类的ShowAnimal()函数进行绘图。
为了实现上述功能,编写一个名为DynamicallyDisplay()的绘图函数,点击列表框时,就会调用该函数,它根据用户的选择,动态加载参数所指定的类。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection; using ShowAnimals; using System.Diagnostics; namespace DynamicLoading { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //函数:绘图程序
public void DynamicallyDisplay(string typeName) { Graphics graphics = this.CreateGraphics(); //动态加载程序集 Assembly assembly = Assembly.LoadFrom("ShowAnimals.dll"); //获取动物类型 Type AnimalClass = assembly.GetType(typeName); //创建动物实例 dynamic someone = Activator.CreateInstance(AnimalClass, null); //调用对象 someone.ShowAnimal(graphics, 75, 50); } //下拉式列表框的事件处理程序(用户选择时做出反应) private void selectAnimalComboBox_SelectedIndexChanged(object sender, EventArgs e) { string typeName = "ShowAnimals." + selectAnimalComboBox.SelectedItem; DynamicallyDisplay(typeName); } } }
运行结果正常,选那个动物,出那个图片。
我现在郁闷的是dymamic创建对象的方式。
dynamic someone = Activator.CreateInstance(AnimalClass, null);
感觉非常别扭,如果能用new多好啊,
dynamic someone = new AnimalClass();
结果却出现了错误。
在网上查了半天都是这种用法的
dynamic someone = new Tiger(); someone.DosomeThing();
这种用法显然存在问题,既然都知道类型为Tiger了,还用dynamic 干嘛?不如用静态声明对象了。
Tiger someone = new Tiger();
dynamic显然最好用于对象类型未知的状况,但这种情况下又不能用new运算符,真是别扭。
有更好的解决办法吗?怎样才能是程序看起来更顺畅呢?望大牛指教。