首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开放泛型MEF

开放泛型MEF
EN

Stack Overflow用户
提问于 2013-12-04 08:55:57
回答 2查看 4K关注 0票数 3

我有这些接口

代码语言:javascript
复制
public interface IImageSource<T>
{
    // Properties
    T OutputFrame { get; set; }
    string Name { get; set; }
    Guid Guid { get; set; }

    // Events
    event EventHandler<DmEventArgs<T>> NewFrameOutput;

    // Methods
    bool Start();
    bool Stop();
    void Initialize();
}

public interface IImageFilter<TIn, TOut>
{
    // Properties
    TIn Input { get; set; }
    string Name { get; set; }
    Guid Guid { get; set; }

    TOut Process(TIn frame);
}

基于这些接口,我创建了如下类

代码语言:javascript
复制
[Export(typeof(IImageSource<>))]
public class AForgeImageSource : IImageSource<Image<Bgr, byte>>
{
    // Implementation...
}

[Export(typeof(IImageFilter<,>))]
public class AnotherFilter1 : IImageFilter<Image<Bgr, byte>, Image<Bgr, byte>>
{
    // Implementation...
}

问题是如何使用MEF将实现IImageSource的所有对象填充到可观察的集合ImageSources?中,还是如何使用MEF将实现IImageFilter的所有对象都填充到可观察的集合ImageFilters中?

我试了下,但没有工作。顺便说一句,我用的是MEF和MEF。

代码语言:javascript
复制
    [ImportMany]
    public ObservableCollection<IImageSource<object>> ImageSources
    {
        // Implementation...
    }

    [ImportMany(typeof(IImageFilter<object, object>))]
    public ObservableCollection<IImageFilter<object, object>> ImageFilters
    {
        // Implementation...
    }

ImageFilters的集合可以由

代码语言:javascript
复制
IImageFilter<string, string>
IImageFilter<string, int>
IImageFilter<int, double>

这是我让MEF做作文的代码。

代码语言:javascript
复制
public void LoadPluginList()
{
    var pluginsDirectoryPath = Environment.CurrentDirectory + "\\Plugins";
    //var aggregateCatalog = new AggregateCatalog();
    //var genericCatalog = new GenericCatalog();

    var catalog = new DirectoryCatalog(pluginsDirectoryPath);
    var container = new CompositionContainer(catalog);

    container.ComposeParts(this);
}

知道怎么让这件事起作用吗?

EN

回答 2

Stack Overflow用户

发布于 2013-12-04 09:52:24

这是一些样品

这些不起作用

基数不匹配导致TestModule被拒绝。

1.

代码语言:javascript
复制
[Export(typeof(IEnumerable<>))]
public class IntegerCollection: List<int>
{

}

[ModuleExport(typeof(TestModule))]
public class TestModule : Microsoft.Practices.Prism.Modularity.IModule
{
    [Import(typeof(IEnumerable<>))]
    public IEnumerable<int> Integers
    {
        get { return m_Integers; }
        set { m_Integers = value; }
    } private IEnumerable<int> m_Integers;


    public void Initialize()
    {
    }
}

2.

代码语言:javascript
复制
[Export(typeof(IEnumerable<>))]
public class IntegerCollection: List<int>
{

}

[ModuleExport(typeof(TestModule))]
public class TestModule : Microsoft.Practices.Prism.Modularity.IModule
{
    [Import]
    public IEnumerable<int> Integers
    {
        get { return m_Integers; }
        set { m_Integers = value; }
    } private IEnumerable<int> m_Integers;


    public void Initialize()
    {
    }
}

这个可以用

代码语言:javascript
复制
[Export(typeof(IEnumerable<object>))]
public class IntegerCollection: List<int>
{

}

[ModuleExport(typeof(TestModule))]
public class TestModule : Microsoft.Practices.Prism.Modularity.IModule
{
    [Import(typeof(IEnumerable<object>))]
    public IEnumerable<int> Integers
    {
        get { return m_Integers; }
        set { m_Integers = value; }
    } private IEnumerable<int> m_Integers;


    public void Initialize()
    {
    }
}

为什么?好的,int是从object指定的,所以我可以将IEnumerable<int>导出为IEnumerable<object>,没有问题。

但是,如果我导出了一个IEnumerable<double>IEnumerable<object>,它就会失败,因为double不能分配给int

我的建议:

  • 考虑一个非泛型基接口。
  • 将筛选器导入到IEnumerable类型的属性,但将契约名称字符串用于导出和导入定义。例如[Export("IMAGE_FILTERS")]
票数 2
EN

Stack Overflow用户

发布于 2013-12-04 09:34:56

导出和导入类型不匹配。试一试

代码语言:javascript
复制
[Export(typeof(IImageFilter<object,object>))]
public class AnotherFilter1 : IImageFilter<Image<Bgr, byte>, Image<Bgr, byte>>
{
// Implementation...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20370882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档