我一直在尝试在一个新项目中使用 MEF,并且在导入工作时遇到了一些困难,我无法解释原因。我正在关注 MSDN 和其他地方的示例,但它们对我不起作用。这是在 .NET 4 项目中使用 MEF 4.0。
我定义了一个简单的合同:
public interface ICommand
{
    int Execute(string[] args);
}
我实现了一些部分并添加了一些元数据:
[Export(typeof(ICommand))]
[ExportMetadata("Name", "init")]
public class InitCommand : ICommand { ... }
[Export(typeof(ICommand))]
[ExportMetadata("Category", "service")]
[ExportMetadata("Name", "start")]
public class StartServiceCommand : ICommand { ... }
我定义了以下元数据接口:
public interface ICommandMetadata
{
    [DefaultValue(null)]
    string Category { get; }
    string Name { get; }
}
在我的主程序中,我正在创建一个基于目录的导出提供程序,然后尝试编写主程序对象:
internal class Program
{
    [ImportMany]
    private IEnumerabe<Lazy<ICommand, ICommandMetadata>> commands;
    private static int Main(string[] args)
    {
        var assembly = Assembly.GetExecutingAssembly();
        var assemblyExportProvider = new CatalogExportProvider(new AssemblyCatalog(assembly));
        var compositionContainer = new CompositionContainer(assemblyExportProvider);
        assemblyExportProvider.SourceProvider = compositionContainer;
        var batch = new CompositionBatch();
        batch.AddPart(this);
        compositionContainer.Compose(batch);
        return 0;            
    }
}
当我运行上面的代码时,这可以按预期工作,并且两个部分都已解决。当我更进一步并创建自定义导出属性时,代码停止工作。这是我的自定义元数据属性和更新的部分:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
[MetadataAttribute]
public sealed class CommandAttribute : ExportAttribute
{
    public CommandAttribute() : base(typeof(ICommand))
    {
    }
    [DefaultValue(null)]
    public string Category { get; set; }
    public string Name { get; set; }
}
[Command(Name = "init")]
public class InitCommand : ICommand { ... }
[Command(Category = "service", Name = "start")]
public class StartServiceCommand : ICommand { ... }
通过应用自定义导出属性,我的程序中的命令集合是一个空数组。我又玩了一些,我发现如果我将元数据接口中的属性更改为字符串数组,导入会再次起作用:
public interface ICommandMetadata
{
    [DefaultValue(null)]
    string[] Category { get; }
    string[] Name { get; }
}
谁能告诉我我做错了什么?为什么这仅在我在元数据接口中使用数组时才有效?有没有办法在不使用属性数组的情况下完成这项工作?
在此先感谢您的帮助。