要判断类型,对于类型变量,就是写if(typeof(PluginB).IsAssignableFrom(x))
对于对象,就是写if(x is PluginB)

解决方案 »

  1.   

    不知道你如何使用MEF。它可以自动收集类型,也可以自动创建对象实例。而且后者更常用。如果你只是收集到类型,那么使用 (Iplugin)Activator.CreateInstance(x)  方法创建对象实例。
      

  2.   


    这样的话,与我要的目的是相违背的,如果这时又动态加载进来了个PluginD,我想得到PluginD的实例,不是还得改程序了?我目前的想法是,是否能传一个类名参数过来,就能实例化相应类的实例,比如IPlugin plu=GetService("PluginB")这样子
      

  3.   


    我现在是已经自动创建好了对象,导入到了一个IEnumerable<IPlugin>对象,现在这个对象里有A,B,C三个对象了,就是不知道通过什么方式得到我想要的B对象,我想我的代码是这个样子的,IPlugin plu=GetService("PluginB")
      

  4.   


    看不懂你写的是什么意思?!MEF是自动搜索到所有符合某接口的实现。例如你有一个“照相机”接口,那么你直接可以得到进程中所有(后期链接并且加载的)符合这个接口的对象。比如说有20种照相机,其中许多甚至是从其它磁盘目录下的exe、dll文件被发现出来的。你的程序可以自动得到这20种照相机的对象实例集合,或者这20种照相机各自的类型集合。至于说你需要“佳能、长焦”照相机,那是你的程序自己去遍历、去筛选的事情。跟MEF无关。MEF负责帮你收集当前磁盘目录、系统目录、其它任意指定目录下的可以被反射出来的相关的对象(或者类型)。它的目的是给你提供一个方便“遍历”的接口,至于说你需要再从结果中去挑出一个出来,那跟MEF无关。
      

  5.   


    你想挑一个出来,可以写(假设你的“IEnumerable<IPlugin>对象”使用变量container表示)PluginB plu = (PluginB) container.FirstOrDefault(x=> x is PluginB);
    if(plu != null)
    {
        .......但是,如果你需要一个PluginB,你为什么不用 MEF 来帮你直接自动收集 IEnumerable<PluginB>对象呢?
      

  6.   


    你想挑一个出来,可以写(假设你的“IEnumerable<IPlugin>对象”使用变量container表示)PluginB plu = (PluginB) container.FirstOrDefault(x=> x is PluginB);
    if(plu != null)
    {
        .......但是,如果你需要一个PluginB,你为什么不用 MEF 来帮你直接自动收集 IEnumerable<PluginB>对象呢?我不能直接使用PluginB类来做操作的,不然的话我还要引用PluginB类,我只想通过类名字符串或是一些别的信息告诉container,我要取他中间的哪一个来实例化我的IPlugin对象
      

  7.   

    利用 IPlugin 中诸如,名称,版本等信息来判断。