Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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导入场景_C#_.net_Mef - Fatal编程技术网

C# MEF导入场景

C# MEF导入场景,c#,.net,mef,C#,.net,Mef,嗨 我在导入场景中遇到一些问题,例如: [Export(typeof(IICon))] public class WriteInputData : IICon { [Import(typeof(IIOWriter))] public IIOWriter IOWriter { get; set; } public object Input { get; set; } public void Process() { IOWriter.Wr

嗨 我在导入场景中遇到一些问题,例如:

 [Export(typeof(IICon))]
public class WriteInputData : IICon
{
    [Import(typeof(IIOWriter))]
    public IIOWriter IOWriter { get; set; }

    public object Input { get; set; }

    public void Process()
    {
        IOWriter.Write(Input);
    }
}
然后我有两个实现接口IIowWriter的类,如:

[Export(typeof(IIOWriter))]
public class FileWriter : IIOWriter
{
    public string FilePath { get; set; }

    public void Write(object data)
    {
        if (string.IsNullOrEmpty(FilePath))
            FilePath = @"c:\test.txt";
        var fl = new StreamWriter(FilePath, true);
        fl.Write((string)data);
        fl.Flush();
        fl.Close();
    }

    public string Name
    {
        get { return "FileWriter"; }
    }
}
[Export(typeof(IIOWriter))]
public class ConsoleWrite : IIOWriter
{
    public void Write(object data)
    {
        Console.WriteLine((string)data);
    }

    public string Name
    {
        get { return "ConsoleWrite"; }
    }
}
我怎样才能让用户在运行时更改它,例如,当他在ListBox FileWriter中键入select时,而不是在WriteInputData中键入IIowWriter时,FileWriter将注入FileWriter end这样一个。。
对不起,我的英语不好。

您可能需要为导出提供一些元数据,例如:

[Export(typeof(IIOWriter)),
 ExportMetadata("Name", "ConsoleWriter")]
public class ConsoleWriter : IIOWriter
{

}
您需要这样做的原因是,您需要提前知道用户选择将匹配什么。因此,您可能需要重构设计,以删除对
IOWriter
属性的依赖:

[Export(typeof(IICon))]
public class WriteInputData : IICon
{
  public object Input { get; set; }

  public void Process(IIOWriter writer)
  {

  }
}
如果您定义要在实例中采用的
过程
方法,我们可以使用
合成容器
解决它。首先,定义与
ExportMetadata
值匹配的元数据接口:

public interface INamedMetadata
{
  string Name { get; }
}
然后,我们可以解析该实例:

public IIOWriter GetWriter(string name)
{
  return container
    .GetExports<IIOWriter, INamedMetadata>()
    .Where(e => e.Metadata.Name.Equals(name, StringComparison.OrdinalIgnoreCase))
    .Select(e => e.Value)
    .FirstOrDefault();
}
public IIOWriter GetWriter(字符串名)
{
返回容器
.GetExports()
.Where(e=>e.Metadata.Name.Equals(Name,StringComparison.OrdinalIgnoreCase))
.选择(e=>e.Value)
.FirstOrDefault();
}

希望这为您指明了正确的方向……

+1但是没有必要显式调用容器来使用元数据。您只需导入
IEnumerable