日期:2014-05-16  浏览次数:20893 次

c#的Assembly.Load.CreateInstance(反射)和.config的使用

作为一个初学者,整了一下午才弄明白,在这里写出来分享给像我一样的初学者

C#的Assembly.Load.CreateInstance是C#反射机制的一部分因为论坛上有个人问了个类似的问题,然后之前看设计模式上还提到了这个,当时没弄明白而且还可耻的误导了。。。

C#的Assembly.Load.CreateInstance方法的使用是这样的:

Assembly.Load("程序集名称").CreateInstance("命名空间.类")

然后他会返回一个object类型(也就是所有类的基类)的一个对象,这时候我们使用强制类型转换就行了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;//使用反射一定要加上这个!

namespace Reflection
{
    class Program
    {
        static void Main(string[] args)
        {
            ILoveMM mm = (ILoveMM)Assembly.Load("Reflection").CreateInstance("Reflection.LoveMM");//这块直接强制类型转换就行
            mm.Output();    
        }
    }
    interface ILoveMM
    {
        void Output();
    }
    class LoveMM : ILoveMM
    {
        public void Output()
        {
            Console.WriteLine("I love you MM");
        }
    }
}

这里面要说一点,假如有一个类是在另外的一个类里面的话,比如在上面的程序中,Program类中还有一个MM类的话,那么我们用“Reflection.Program.MM”去使用方法的话是不可行的,这样方法会返回null,如果哪位大牛知道这种情况应该怎么写,请不吝赐教~ :)


上面的程序有一个缺点就是如果我们想要生成另外的一个类的对象的话要么改代码,要么输入,貌似有点违背开闭原则?所以我们可以用config文件来改变这一个现状。

添加config文件:

在“项目”->“添加新项” 中找到“应用程序配置文件”,然后点确定,这样我们的config文件就诞生啦~

这个文件我是这么写的。。。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="ClassName" value="LoveMM1" />
  </appSettings>
</configuration>

这里面的key后面的"ClassName"就是我们要保存的变量名称(因为不知道怎么叫T_T) value也就是“LoveMM1”是要保存的值

注意"appSettings"的大小写一定不要错,不过vs的代码补全可以弥补这点~

然后就是config文件的读写问题

对于config文件的读写多是用ConfigurationManager,这个类的使用方法嘛。。。

首先在“项目”->“添加引用” 中找到System.Configuration 然后点击这项,会发现前面出来一个√ 然后确定。

接着在代码揩油加上 using System.Configuration; 就可以用了,直接加 using貌似不能用 -_-||

现在我们就能使用ConfigurationManager类啦~

读取的方法就是

string s = ConfigurationManager.AppSettings["ClassName"].ToString();//这里面的ClassName对应上面App.config文件中的 key

这样我们就能读取到config文件中所保存的相关信息。

修改来说相对麻烦

Configuration ConfigWriter = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);//新建写config文件的对象
ConfigWriter.AppSettings.Settings["ClassName"].Value = "LoveMM2";//ClassName是要改的key LoveMM2是要修改的值
ConfigWriter.Save(ConfigurationSaveMode.Modified);//保存文件
//ConfigWriter.SaveAs("App.config");
ConfigurationManager.RefreshSection("appSettings");//刷新appSettings
再详细的说一下

第一行就是打开config文件 ConfigurationUserLevel.None是获取所有用户的Configuration

第二行,这个一开始以为是方法,后来发现不是-_-|| 就是["key"].value的方式

第三行,可能有人已经发现了,第四行被我注释掉了,因为一开始我也是用第四行的方法保存的,但是发现保存时保存了,结果仍然不变,所以就按MSDN的方式去写了。

最后一行,这个玩意也挺重要的。。。这个就是负责刷新,要不然保存config文件,然后再读取,结果发现数值不变-_-||

最后上下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Configuration;

namespace Reflection
{
    class Program
    {
        public static void ReadConfig()
        {
            string s = ConfigurationManager.AppSettings["ClassName"].ToString();
            string NameSpaceName = "Reflection";
            string ClassName = NameSpaceName + "." + s;
            ILoveMM mm = (ILoveMM)Assembly.Load(NameSpaceName).CreateInstance(ClassName);
            mm.Outpu