由于项目中用到了反射,准备把各个类库都先写在配置文件中,然后读取配置文件,再对配置文件中配置的类库进行反射。
这样做的好处是各个类库保持独立,其中一个类库出现问题不会影响其他类库,更新项目时,只要更新单个DLL就可以了。
1. 首先看下配置文件怎样进行配置
在上面的配置文件中创建了自定义节点processors,然后在processors节点下面对应的是方法节点。
上面的项目中使用了两个方法,所以创建了两个节点。type表示程序集名称, method表示方法名称。
2.看下怎样使用配置文件
private void button1_Click(object sender, EventArgs e)
{
//返回配置文件中的节点名称和元数据信息
IDictionary<String,MethodInfo> dic=LoadAppConfig(Application.StartupPath + "\\App.config");
//测试GetInfo方法
var mi = dic["GetInfo"];
var obj = Activator.CreateInstance(mi.DeclaringType);
object[] para={"hello"};//如果数组的长度和参数的个数不匹配,会报异常
//返回方法结果值
object result = mi.Invoke(obj, para);
MessageBox.Show(result.ToString());
}
/// <summary>
/// 读取配置文件
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
private Dictionary<string, MethodInfo> LoadAppConfig(string filename)
{
var processors = new Dictionary<string, MethodInfo>();
var xml = new XmlDocument();
xml.Load(filename);
foreach (XmlNode node in xml.SelectNodes("configuration/processors/*"))
{
if (node.NodeType != XmlNodeType.Element)
continue;
var method = node.Name;
try
{
string typeName = node.Attributes["type"].Value;//程序集名称
string methodName = node.Attributes["method"].Value;//方法名称
var t = Type.GetType(typeName);
var m = t.GetMethod(methodName);
processors.Add(methodName, m);
}
catch (Exception e)
{
}
}
return processors;
}
DEMO下载:http://download.csdn.net/detail/zx13525079024/4734769