C#中反射的简单运用
1、创建一个控制台应用程序;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("------------------通过new创建对象-------------------");
IDBHelper dbHelper = new DBHelper();
dbHelper.Query();
string nameSpace = ConfigurationManager.AppSettings["DB.Interface.IDBHelper"];
string[] nameSpaceArray = nameSpace.Split(',');
Assembly assembly = Assembly.Load(nameSpaceArray[0]); //动态加载dll
foreach (Type type in assembly.GetTypes())
{
Console.WriteLine("类型名称:{0}", type.FullName);
}
Console.WriteLine("------------------通过反射创建对象-------------------");
Type dbHelperType = assembly.GetType(nameSpaceArray[1]); //根据基类完整名称,找到类型
object oDBHelper = Activator.CreateInstance(dbHelperType); //根据基类类型创建对象
IDBHelper reDBHelper = (IDBHelper)oDBHelper; //强制转换
reDBHelper.Query();//调用方法
Console.ReadKey();
}
}
2、创建一个类库命名为DB.Interface,在此类库中创建一个借口IDBHelper,接口中有方法Query();
namespace DB.Interface
{
public interface IDBHelper
{
void Query();
}
}
3、再创建一个类库命名为DB.Sqlserver,在此类库中创建类DBHelper类实现接口IDBHelper;
namespace DB.Sqlserver
{
public class DBHelper : IDBHelper
{
public void Query()
{
Console.WriteLine("这是{0}的Query", this.GetType().FullName);
}
}
}
4、修改配置文件实现程序的可配置可拓展;
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<appSettings>
<add key="DB.Interface.IDBHelper" value="DB.Sqlserver,DB.Sqlserver.DBHelper"/>
//<add key="DB.Interface.IDBHelper" value="DB.MySql,DB.MySql.DBHelper"/>
</appSettings>
</configuration>
5、另外创建一个类库与步骤3相同命名为DB.MySql;
namespace DB.MySql
{
public class DBHelper : IDBHelper
{
public void Query()
{
Console.WriteLine("这是{0}的Query", this.GetType().FullName);
}
}
}
6、修改步骤4的配置文件中的,实现只通过修改配置文件来修改程序的运行结果,使程序的可扩展性更强;
<add key="DB.Interface.IDBHelper" value="DB.MySql,DB.MySql.DBHelper"/>
7、不同配置文件不同的结果,如下:
<add key="DB.Interface.IDBHelper" value="DB.Sqlserver,DB.Sqlserver.DBHelper"/>
<add key="DB.Interface.IDBHelper" value="DB.MySql,DB.MySql.DBHelper"/>