C#4.0出来后,我打算用dynamic关键字重写以前的一个问题。

问题是这样的。

clip_image002[5]

 

首先我编写好了一个程序集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);
        }

    }
}

运行结果正常,选那个动物,出那个图片。

image

我现在郁闷的是dymamic创建对象的方式。

dynamic someone = Activator.CreateInstance(AnimalClass, null);

感觉非常别扭,如果能用new多好啊,

dynamic someone = new AnimalClass();

结果却出现了错误。

image

 

在网上查了半天都是这种用法的

dynamic someone = new Tiger();
      
 someone.DosomeThing();
这种用法显然存在问题,既然都知道类型为Tiger了,还用dynamic 干嘛?不如用静态声明对象了。
Tiger someone = new Tiger();

dynamic显然最好用于对象类型未知的状况,但这种情况下又不能用new运算符,真是别扭。

有更好的解决办法吗?怎样才能是程序看起来更顺畅呢?望大牛指教。