Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MEF GetExports<;T>;()未正确导入_C#_Plugins_Mef - Fatal编程技术网

C# MEF GetExports<;T>;()未正确导入

C# MEF GetExports<;T>;()未正确导入,c#,plugins,mef,C#,Plugins,Mef,我的元数据接口和属性有基本接口 public interface IBase { string Name { get; } } public interface IAAAMetaData : IBase { string[] Names { get; } } [MetadataAttribute] [AttributeUsage(AttributeTargets.Method)] public class AAAMetaData : ExportAttribute, IA

我的元数据接口和属性有基本接口

public interface IBase
{
    string Name { get; }
}


public interface IAAAMetaData : IBase
{
    string[] Names { get;  }
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Method)]
public class AAAMetaData : ExportAttribute, IAAAMetaData
{
    public AAAMetaData(string contract)
    {
        Name = contract;
    }

    public AAAMetaData(string[] contracts)
    {
        Names = contracts;
    }
    public string Name { get; set; }
    public string[] Names { get; set; }
}


public interface IBBBMetaData : IBase
{
    string[] Names { get; }
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Method)]
public class BBBMetaData : ExportAttribute, IBBBMetaData
{

    public BBBMetaData(string contract)
    {
        Name = contract;
    }

    public BBBMetaData(string[] contracts)
    {
        Names = contracts;
    }
    public string Name { get; set; }
    public string[] Names { get; set; }
}
这是我的插件:

    [AAAMetaData("Test1")]
    public void Plugin1(object sender, EventArgs e)
    {
        sender = "Plugin1";
    }

    [BBBMetaData("Test2")]
    public void Plugin2(object sender, EventArgs e)
    {
        sender = "Plugin2";
    }
现在,当我尝试获取导出时,我得到了错误的结果。以下是我用于获取导出的代码:

var exports = _container.GetExports<Action<object, EventArgs>, IAAAMetaData>();
var exports=\u container.GetExports();
GetExprts()
的结果中,我得到了列表中的两项。如果我打开列表并看到其中的项目,也会导入Plugin2。这里怎么了
IAAAMetaData
IBMetaData
是完全不同的东西。您甚至不能将
IAAAMetaData
强制转换为
IBBBMetaData
。有人能解释一下这里发生了什么吗


谢谢你的帮助

我不知道有一个具有多个泛型参数的方法,但是由于您没有得到编译器错误,我假设确实存在一个。但是,第二个参数可能不是合同类型。MEF中的合同按名称指定。因此,请尝试以下方法:

var exports = _container.GetExports<Action<object, EventArgs>>( "Test1" );
var exports=\u container.GetExports(“Test1”);

IMOIAAAMetaDataIBBBMetaData没有太大区别。他们实际上是一模一样的

根据输入的是IAAAMetaData还是IBBBMetaData,proof-GetExports检索相同InnMetadata类型的两项。由于相同的基本接口,您实际上可以编写:

var exports = container.GetExports<Action<object, EventArgs>, IBase>();

var exports=container.GetExports();
您将得到两个类型为IBase=>Test1和Test2的项

因此,使用您的代码,我找到的唯一解决方案是使用合同名称:

var exports = container.GetExports<Action<object, EventArgs>, IAAAMetaData>().FirstOrDefault(iaaaa => iaaaa.Metadata.Name == "Test1"); 

var exports=container.GetExports().FirstOrDefault(iaaaa=>iaaaa.Metadata.Name==“Test1”);

在这种情况下,GetExports的接口参数是不相关的。

这背后的原因是两个元数据接口具有完全相同的属性。每个属性的类型和名称相同。例如,如果您将接口更改为:

public interface IAAAMetaData : IBase
{
    string[] AAA_Names { get;  }
}

public interface IBBBMetaData : IBase
{
    string[] BBB_Names { get; }
}
您将获得预期的单一导出

以下内容的元数据筛选和DefaultValueAttribute部分对此进行了解释:

指定元数据视图时,将对其进行隐式筛选 仅匹配包含定义的元数据属性的导出 在视图中


当然,如果导出方法的签名不同,就不会发生这种情况。尝试添加一个额外的变量,您将获得单个导出。另一种方法是将合同名称与
ExportAttribute
ImportAttribute

一起使用。请看一下。@pasty我在您提供的链接中没有看到有用的信息。也许我不能很好地解释我的问题。如果你对理解我的问题有任何疑问,请告诉我。在我的情况下,我无法填写合同名称。我之所以使用“Test1”还有其他原因。var exports=container.GetExports().FirstOrDefault(iaaaa=>iaaaa.Metadata.Name==“Test1”);它返回[什么]。如果我把这两个插件都放在“Test1”中呢。我只是不想要清单上的第一项。将有许多插件使用这些属性。在调试代码时,查看导出并查看每个项的类型-两个项的类型相同!为了从某些特定类型中提取插件,您可能需要一个FilteredCatalog和命名属性。您是对的,我在前面发现了这个问题,但忘了在这里更新。谢谢