最近一个项目要实现接口的动态调用。一个接口有多个实现类,但是要在程序外(比如说配置文件或者数据库表里)定义到底应该掉用哪一个实现类,这样可以极大的提高程序的扩展性,调试也方便维护,多人同时使用一个程序时也可以根据不同的需要写自己的实现类。
下面讲具体的实现方法,这里主要用到的是反射的方法。
一、首先先建一个接口IAnimal,该接口里面就一个Cry的方法。
public interface IAnimal
{
string Cry();
}
二、然后定义一个Cat类实现该接口:
public class Cat:IAnimal
{
public string Cry()
{
return "猫的叫声是:喵喵";
}
}
再添加一个Dog类来实现该接口:
public class Dog:IAnimal
{
public string Cry()
{
return "狗的叫声是:汪汪";
}
}
三、添加一个windows窗体,并且添加动态加载该接口的具体类和具体的调用方法和结果输出,如下:
其中文本框中的内容为类的具体路径,具体实现方法如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void bt_cat_Click(object sender, EventArgs e)
{
try
{
Type type = Type.GetType(t_cat.Text.ToString(), false);
if (type == null)
{
MessageBox.Show("无法加载配置");
return;
}
var obj = Activator.CreateInstance(type);
IAnimal Ia = obj as IAnimal;
t_voice.Text = Ia.Cry();
}
catch(Exception ex)
{
MessageBox.Show("加载异常");
}
}
private void bt_dog_Click(object sender, EventArgs e)
{
try
{
Type type = Type.GetType(t_dog.Text.ToString(), false);
if (type == null)
{
MessageBox.Show("无法加载配置");
return;
}
var obj = Activator.CreateInstance(type);
IAnimal Ia = obj as IAnimal;
t_voice.Text = Ia.Cry();
}
catch (Exception ex)
{
MessageBox.Show("加载异常");
}
}
private void bt_openform_Click(object sender, EventArgs e)
{
try
{
Type type = Type.GetType(t_form.Text.ToString(), false);
if (type == null)
{
MessageBox.Show("无法加载配置");
return;
}
var obj = Activator.CreateInstance(type);
Form fm = obj as Form;
fm.Show();
}
catch (Exception ex)
{
MessageBox.Show("加载异常");
}
}
}
这样就可以简单地实现类的动态调用:
这里同样可以实现窗体的动态加载,都是通过反射来进行查找然后通过
var obj = Activator.CreateInstance(type);
方法来进行实例化。
源代码附上: