public class FilteredCatalog : ComposablePartCatalog, INotifyComposablePartCatalogChanged
{
    #region Private Fields
    private readonly ComposablePartCatalog m_ComposablePartCatalog;
    private readonly INotifyComposablePartCatalogChanged m_NotifyComposablePartCatalogChanged;
    private readonly IQueryable<ComposablePartDefinition> m_Parts;
    #endregion
    #region Constructors
    /// <summary>
    /// 默认构造函数。
    /// </summary>
    /// <param name="composablePartCatalog">包含了所有导出部件的目录Catalog。</param>
    /// <param name="expression">筛选条件表达式。</param>
    public FilteredCatalog(ComposablePartCatalog composablePartCatalog, Expression<Func<ComposablePartDefinition, bool>> expression)
    {
        m_ComposablePartCatalog = composablePartCatalog;
        m_NotifyComposablePartCatalogChanged = composablePartCatalog as INotifyComposablePartCatalogChanged;
        m_Parts = composablePartCatalog.Parts.Where(expression);
    }
    #endregion
    #region INotifyComposablePartCatalogChanged
    /// <summary>
    /// 部件目录Catalog已经改变后触发的事件。
    /// </summary>
    public event EventHandler<ComposablePartCatalogChangeEventArgs> Changed
    {
        add
        {
            if (m_NotifyComposablePartCatalogChanged != null)
            {
                m_NotifyComposablePartCatalogChanged.Changed += value;
            }
        }
        remove
        {
            if (m_NotifyComposablePartCatalogChanged != null)
            {
                m_NotifyComposablePartCatalogChanged.Changed -= value;
            }
        }
    }
    /// <summary>
    /// 部件目录Catalog正在发生改变时触发的事件。
    /// </summary>
    public event EventHandler<ComposablePartCatalogChangeEventArgs> Changing
    {
        add
        {
            if (m_NotifyComposablePartCatalogChanged != null)
            {
                m_NotifyComposablePartCatalogChanged.Changing += value;
            }
        }
        remove
        {
            if (m_NotifyComposablePartCatalogChanged != null)
            {
                m_NotifyComposablePartCatalogChanged.Changing -= value;
            }
        }
    }
    #endregion
    #region ComposablePartCatalog
    /// <summary>
    /// 获取目录中包含的部件定义。经过构造函数中的表达式过滤后,已经是传入目录Catalog对象中的一部分导出部件了。
    /// </summary>
    public override IQueryable<ComposablePartDefinition> Parts
    {
        get { return m_Parts; }
    }
    #endregion
}上述代码中概括来说包含如下几点内容:// 获取所需的部件。
DirectoryCatalog catalog = new DirectoryCatalog("controls");
CompositionContainer container = new CompositionContainer(catalog);
// 过滤Catalog,生成子组合容器。
FilteredCatalog filteredCatalog = new FilteredCatalog(catalog,
    o=>o.Metadata.ContainsKey("UC") && o.Metadata["UC"].ToString() == "BB");
CompositionContainer filteredContainer = new CompositionContainer(filteredCatalog, container);
UserControl userControl = filteredContainer.GetExportedValue<UserControl>();
this.MainContentControl.Content = userControl;首先通过DirectoryCatalog类获取到应用程序根目录下controls子文件夹中的所有部件定义,并以此生成顶级组合容器container(类型为CompositionContainer)。2、参考了微软MVP Bēniaǒ的文章《MEF程序设计指南七:使用目录(Catalog)动态装载xap与目录筛选(Filtered Catalog)》,访问地址:http://www.cnblogs.com/beniao/archive/2010/07/26/1782622.html
原文:http://blog.csdn.net/gjysk/article/details/45055379