2012-04-30 45 views
2

我已經創建了屬於MEF的自定義屬性,我希望定義與該類相關的id列表,以便我可以查詢它們。將列表添加到系統屬性

而且該類必須包含在自身定義,這是很重要的,這就是爲什麼我想過使用:

[SignalSystemData("ServiceIds", new List<int>(){1})] 

我應如何處理?

我的搜索的實現如下:

 var c = new Class1(); 
     var v = c.EditorSystemList; 

     foreach (var lazy in v.Where(x=>x.Metadata.LongName=="ServiceIds")) 
     { 
      if (lazy.Metadata.ServiceId.Contains(serviceIdToCall)) 
      { 
       var v2 = lazy.Value; 
       // v2 is the instance of MyEditorSystem 
       Console.WriteLine(serviceIdToCall.ToString() + " found"); 

      }else 
      { 
       Console.WriteLine(serviceIdToCall.ToString() + " not found"); 
      } 
     } 

我與定義導出類應該是這樣的:

[Export(typeof(IEditorSystem))] 
[SignalSystemData("ServiceIds", new List<int>{1})] 
public class MyEditorSystem1 : IEditorSystem 
{ 
    void test() 
    { 
     Console.WriteLine("ServiceID : 1"); 
    } 
} 


public interface IEditorSystem 
{ 
} 

[MetadataAttribute] 
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class SignalSystemDataAttribute : ExportAttribute 
{ 
    public SignalSystemDataAttribute(string longName, List<int> serviceId) 
     : base(typeof (IEditorSystem)) 
    { 
     LongName = longName; 
     ServiceId = serviceId; 
    } 

    public string LongName { get; set; } 
    public List<int> ServiceId { get; set; } 

} 

public interface IEditorSystemMetadata 
{ 
    string LongName { get; } 
    List<int> ServiceId { get; } 
} 
+0

這不會飛。 [屬性值必須是(編譯時)常量。](http://msdn.microsoft.com/en-us/library/yd21828z.aspx) –

+0

@ Christian.K這就是我所知道的,所以我試圖找到方式會怎樣,而不是訴諸於使用昏迷分離的字符串。 – cpoDesign

+0

啊,對不起。你可能想在你的問題中指出這一點。我的答案也是如此。 –

回答

0

要解決的編譯時間常數問題,您有以下選擇:

  • 使用特殊格式的字符串(即逗號分隔的整數列表,因爲您已經s uggested)。
  • 使用多個重載,每個重載的ID都有不同數量的參數。如果你有太多的ID需要傳遞,這會變得混亂。
  • 使用params int[] ids作爲構造函數的最後一個參數。這將起作用,但不符合CLS - 如果這對您很重要。
  • 最容易使用數組int []的說法。

當然你也可以使用上述的組合。有一些重載說與1至5 ID參數,並提供一個字符串參數或params int[]參數爲那些(希望)的角落情況下,超載參數是不夠的。

更新:剛剛發現this問題/答案。可能不是重複,但處理相同的問題(主要)。

+0

thnx這是我一直在尋找。 – cpoDesign