初探反射(三)之插件开发

今天我们来说说插件的开发。首先我们来看看下面这段代码:

 

  
    
namespace XylF
{
public interface Cs
{
void DoIt();
}


[AttributeUsage(AttributeTargets.Class
| AttributeTargets.Struct,Inherited = false )]
public sealed class XylAttribute :Attribute
{
private string msg;

public string Msg
{
get { return msg; }
set { msg = value; }
}
public XylAttribute()
{ }

public XylAttribute( string msg)
{
this .msg = msg;
}

}
}

 

这里我们创建了一个接口 这个接口表示插件需要去实现里面的方法,接口本身是什么作用的 它在这里就是一个契约,插件需要去遵循它。

然后我们看看插件是怎么写的:

 

  
    
namespace Lz
{

[Xyl(Msg
= " Edit by Xyl " )]
public class Lzs:Cs
{

public void DoIt()
{
Console.WriteLine(
" this is c# " );
}
}
}

 

我们在插件里面引入XylF的程序集 然后继承Cs接口 实现接口里面的方法(插件遵循接口给出的契约)这里为了方便,方法只输出一句话。有了约束和插件 我们来看看主程序怎么写:

 

  
    
static void Main( string [] args)
{

Console.WriteLine(
" 请输入插件名称 " );
string path = Console.ReadLine();
Assembly asm
= null ;
try
{
asm
= Assembly.Load(path);

}
catch (FileNotFoundException e)
{
Console.WriteLine(e.Message);
}
var sm
= from c in asm.GetTypes() where c.IsClass && ((c.GetInterface( " Cs " ) != null )) select c;

foreach (Type t in sm)
{
Cs ts
= (Cs)asm.CreateInstance(t.FullName, true );
ts.DoIt();
var sm1
= from c in t.GetCustomAttributes( typeof (XylAttribute), false ) select c;
foreach (XylAttribute x in sm1)
{
Console.WriteLine(x.Msg);
}

}
}

 

这里 我们同样要引入XylF的程序集,然后是用assembly.load的方法来晚期绑定程序集,然后使用linq 返回类型属于Class实现了Cs接口的类的枚举,然后进行迭代创建实体然后穿换成接口 调用接口的方法。

初探反射(三)之插件开发

我们出入了插件的名字,就调用了插件的方法。 就说到了这里吧 发烧ing`````吃药

 

转载请注明出处:www.cnblogs.com/xylasp

欢迎加关注 呵呵

你可能感兴趣的:(插件开发)