假设我们有一个类叫TUser,保存了用户的信息,很简单,只有username和email两个字段
/***************************************************************
** /user.cs
** 编译参数 csc /t:library /out:bin/user.dll user.cs
***************************************************************/
namespace demo
{
public class TUser
{
public string UserName = "";
public string Email = "";
public TUser(string userName, string email)
{
this.UserName = userName;
this.Email = email;
}
}
}
** /user.cs
** 编译参数 csc /t:library /out:bin/user.dll user.cs
***************************************************************/
namespace demo
{
public class TUser
{
public string UserName = "";
public string Email = "";
public TUser(string userName, string email)
{
this.UserName = userName;
this.Email = email;
}
}
}
下面是我们的模板的接口 ITemplate,只有一个 Print 方法
/***************************************************************
** /ITemplate.cs
** 编译参数 csc /r:user.dll /t:library /out:bin/ITemplate.dll ITemplate.cs
***************************************************************/
namespace demo
{
public interface ITemplate
{
void Print(TUser u);
}
}
** /ITemplate.cs
** 编译参数 csc /r:user.dll /t:library /out:bin/ITemplate.dll ITemplate.cs
***************************************************************/
namespace demo
{
public interface ITemplate
{
void Print(TUser u);
}
}
下面是一个其中一个模板的实现,名字叫 table
/***************************************************************
** /template/table.cs
** 编译参数 csc /r:..\bin\user.dll,..\bin\ITemplate.dll /t:library /out:bin/dll/table.dll table.cs
***************************************************************/
namespace demo
{
public class Template : ITemplate
{
public void Print(TUser u)
{
System.Console.WriteLine("<template:table>");
System.Console.WriteLine("<username>{0}</username>\n", u.UserName);
System.Console.WriteLine("<email>{0}</email>\n", u.Email);
System.Console.WriteLine("</template:table>");
}
}
}
** /template/table.cs
** 编译参数 csc /r:..\bin\user.dll,..\bin\ITemplate.dll /t:library /out:bin/dll/table.dll table.cs
***************************************************************/
namespace demo
{
public class Template : ITemplate
{
public void Print(TUser u)
{
System.Console.WriteLine("<template:table>");
System.Console.WriteLine("<username>{0}</username>\n", u.UserName);
System.Console.WriteLine("<email>{0}</email>\n", u.Email);
System.Console.WriteLine("</template:table>");
}
}
}
下面是主程序
/***************************************************************
** /program.cs
** 编译参数 csc /r:bin/user.dll,bin/ITemplate.dll /out:bin/program.exe program.cs
***************************************************************/
using System;
using System.Reflection;
using System.Configuration;
namespace demo
{
public class Program
{
static void Main()
{
string dll = ConfigurationManager.AppSettings["template"];
string className = ConfigurationManager.AppSettings["className"];
TUser u = new TUser("ifan", "ifan@cnblogs.com");
Assembly ass = Assembly.LoadFrom(dll);
Type t = ass.GetType(className);
ITemplate o = (ITemplate)Activator.CreateInstance(t);
o.Print(u);
}
}
}
** /program.cs
** 编译参数 csc /r:bin/user.dll,bin/ITemplate.dll /out:bin/program.exe program.cs
***************************************************************/
using System;
using System.Reflection;
using System.Configuration;
namespace demo
{
public class Program
{
static void Main()
{
string dll = ConfigurationManager.AppSettings["template"];
string className = ConfigurationManager.AppSettings["className"];
TUser u = new TUser("ifan", "ifan@cnblogs.com");
Assembly ass = Assembly.LoadFrom(dll);
Type t = ass.GetType(className);
ITemplate o = (ITemplate)Activator.CreateInstance(t);
o.Print(u);
}
}
}
我们把要载入的模板信息放在配置文件里面
<!--
program.exe.config
-->
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="template" value="dll/table.dll"/>
<add key="className" value="demo.Template"/>
</appSettings>
</configuration>
program.exe.config
-->
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="template" value="dll/table.dll"/>
<add key="className" value="demo.Template"/>
</appSettings>
</configuration>
编译后的路径结构是
/bin/program.exe
/bin/program.exe.config
/bin/ITemplate.dll
/bin/user.dll
/bin/dll/table.dll
/bin/program.exe.config
/bin/ITemplate.dll
/bin/user.dll
/bin/dll/table.dll
运行 program.exe 就能看到结果了:
<template:table>
<username>ifan</username>
<email>ifan@cnblogs.com</email>
</template:table>
<username>ifan</username>
<email>ifan@cnblogs.com</email>
</template:table>
现在我们再写一个模板,名字叫list:
/***************************************************************
** /template/list.cs
** 编译参数 csc /r:..\bin\user.dll,..\bin\ITemplate.dll /t:library /out:bin/dll/list.dll list.cs
***************************************************************/
namespace demo
{
public class Template : ITemplate
{
public void Print(TUser u)
{
System.Console.WriteLine("<template:list>");
System.Console.WriteLine("<username>{0}</username>\n", u.UserName);
System.Console.WriteLine("<email>{0}</email>\n", u.Email);
System.Console.WriteLine("</template:list>");
}
}
}
编译后将配置文件中的 template 的 value 改成 dll/list.dll,重新运行 program,能看到不一样的结果:** /template/list.cs
** 编译参数 csc /r:..\bin\user.dll,..\bin\ITemplate.dll /t:library /out:bin/dll/list.dll list.cs
***************************************************************/
namespace demo
{
public class Template : ITemplate
{
public void Print(TUser u)
{
System.Console.WriteLine("<template:list>");
System.Console.WriteLine("<username>{0}</username>\n", u.UserName);
System.Console.WriteLine("<email>{0}</email>\n", u.Email);
System.Console.WriteLine("</template:list>");
}
}
}
<template:list>
<username>ifan</username>
<email>ifan@cnblogs.com</email>
</template:list>
<username>ifan</username>
<email>ifan@cnblogs.com</email>
</template:list>