2011-11-16 25 views
5
[assembly: CLSCompliant(true)] 

//CS3016: Arrays as attribute arguments is not CLS-compliant. 
[ModuleExport(typeof(ModuleA), DependsOnModuleNames = new [] { "ModuleB" })] 
public class ModuleA : IModule { } 

L'unica cosa che mi viene in mente è quello di contrassegnare la classe come [CLSCompliant(false)], ma mi chiedevo se c'è un modo migliore per ottenere intorno a questo?CS3016 - Come possiamo aggirare questo quando si lavora con Prism + MEF ExportModule?

risposta

3

Come soluzione alternativa è possibile implementare il proprio compatibile con CLS ModuleExportAttribute che utilizza un elenco separato da virgole invece di un array di stringhe:

[MetadataAttribute] 
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class StringListModuleExportAttribute : ExportAttribute, IModuleExport 
{ 
    public StringListModuleExportAttribute(Type moduleType) 
     : base(typeof(IModule)) 
    { 
     ModuleName = moduleType.Name; 
     ModuleType = moduleType; 
    } 

    public string ModuleName { get; private set; } 
    public Type ModuleType { get; private set; } 
    public InitializationMode InitializationMode { get; private set; } 
    public string[] DependsOnModuleNames 
    { 
     get 
     { 
      if (string.IsNullOrEmpty(DependsOnModuleNameList)) 
       return new string[0]; 
      return DependsOnModuleNameList.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries); 
     } 
    } 

    public string DependsOnModuleNameList { get; set; } 
} 

Usage:

[StringListModuleExport(typeof(ModuleA), DependsOnModuleNameList = "ModuleB,ModuleC")] 
public class ModuleA : IModule 
{ 
    public void Initialize() 
    { 
     Debug.WriteLine("ModuleA init"); 
    } 
} 
+0

Anche se questo funziona, ho davvero speravo per una soluzione senza dover estendere dalla classe esistente. Ma forse è l'unico modo (al di fuori di sopprimere l'avvertimento). –