Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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 ImportCardinalismatchException_C#_Mef - Fatal编程技术网

C# MEF ImportCardinalismatchException

C# MEF ImportCardinalismatchException,c#,mef,C#,Mef,System.ComponentModel.Composition.ImportCardinalismatchException '未找到与约束匹配的导出:ContractName IntroToMEF.DigitalMonitor RequiredTypeIdentity介绍IMonitor' “ 我的类型是正确的。如果只有一个实例继承自IMonitor,则可以获得导出值。每当我需要使用合同名称时,我都会得到一个错误。我没有主意了 清除Visual Studio缓存不起作用。 [Export(

System.ComponentModel.Composition.ImportCardinalismatchException '未找到与约束匹配的导出:ContractName IntroToMEF.DigitalMonitor RequiredTypeIdentity介绍IMonitor' “

我的类型是正确的。如果只有一个实例继承自IMonitor,则可以获得导出值。每当我需要使用合同名称时,我都会得到一个错误。我没有主意了

清除Visual Studio缓存不起作用。

[Export(typeof(IMonitor))]
公共类数字监视器:IMonitor
{
公开作废开始()
{
Console.WriteLine(“数字监视器:已启动监视”);
}
}
内部类HostMefInApp
{
[进口]
公共ILogger记录器{get;set;}
[进口]
公共IMonitor监视器{get;set;}
私有void ComposeMultiple()
{
WriteLine(“调试:+GetType().Assembly”);
var assemblyCatalog=newassemblycatalog(GetType().Assembly);
var container=新的CompositionContainer(assemblyCatalog);
//var contractName=AttributedModelServices.GetContractName(typeof(FileLogger));
尝试
{
var instanceOffileLogger=container.GetExports();/“IntroToMEF.FileLogger”
}
捕获(ImportCardinalismatchException ex)
{
控制台写入线(ex);
}
CompositionBatch=新的CompositionBatch();
batch.AddPart(AttributedModelServices.CreatePart(新文件记录器());
batch.AddPart(AttributedModelServices.CreatePart(新的DigitalMonitor());
batch.AddPart(AttributedModelServices.CreatePart(新的AnalogMonitor());
容器。组成(批);
var digitalMonitorContractName=AttributedModelServices.GetContractName(typeof(DigitalMonitor));
var currentLogger=container.GetExportedValue();
var digitalMonitor=container.GetExportedValue(digitalMonitorContractName);
记录器=电流记录器;
监视器=数字监视器;
}

我认为您应该:

[Export(typeof(IMonitor))]
[Export(typeof(DigitalMonitor))]
public class DigitalMonitor : IMonitor
{
    public void start()
    {
        Console.WriteLine("Digital Monitor: Started monitoring");
    }
}
也就是说,将DigitalMonitor导出为IMonitor和DigitalMonitor。这将使您能够同时使用这两种方法导入它。当然,您的代码将使用:

var digitalMonitor = container.GetExportedValue<DigitalMonitor>();
var digitalMonitor=container.GetExportedValue();

我认为您应该:

[Export(typeof(IMonitor))]
[Export(typeof(DigitalMonitor))]
public class DigitalMonitor : IMonitor
{
    public void start()
    {
        Console.WriteLine("Digital Monitor: Started monitoring");
    }
}
也就是说,将DigitalMonitor导出为IMonitor和DigitalMonitor。这将使您能够同时使用这两种方法导入它。当然,您的代码将使用:

var digitalMonitor = container.GetExportedValue<DigitalMonitor>();
var digitalMonitor=container.GetExportedValue();