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

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

tek şey [CLSCompliant(false)] olarak sınıf işaretlemek için, ama bu çevrede almak için daha iyi bir yolu olup olmadığını merak ediyorum? Bir dize dizisi yerine virgülle ayrılmış listesini kullanır uyumlu ModuleExportAttribute kendi CLS uygulayabilirsiniz Çözüm olarakCS3016 - Prism + MEF ExportModule ile çalışırken bunu nasıl aşacağız? Aklıma

cevap

3

:

[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; } 
} 

Kullanımı: Bu çalışır

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

, gerçekten umuyordum Mevcut sınıftan genişletmek zorunda kalmadan bir çözüm için. Ama belki de tek yol budur (uyarıyı bastırmanın dışında). –