2013-12-17 47 views
24

我有一個可移植類庫與類PCLDebug創建一個委託時,有一個條件屬性

public static class PCLDebug { 
    public static Action<string> LogLine { get; set; } 
} 

我想要做的就是外項目一旦設置好了,然後就可以調用LogLine在PCL內將東西打印到VS輸出窗口。這裏是我的嘗試:

MyPCL.PCLDebug.LogLine = System.Diagnostics.Debug.WriteLine; 

這裏的問題是,編譯器會抱怨,因爲System.Diagnostics.Debug.WriteLine擁有調試的條件屬性:

無法創建「System.Diagnostics程序委託.Debug.WriteLine(string)',因爲它具有條件屬性

如果LogLine調用只在調試環境中工作,我實際上很好。但是,我如何保持編譯器的快樂?

回答

41

你可以嘗試在一個lambda函數進行包裝:

MyPCL.PCLDebug.LogLine = s => { System.Diagnostics.Debug.WriteLine(s); }; 
+0

這爲我工作。謝謝! – realPT

+0

爲什麼這個工作,但它不直接分配? – reggaeguitar

+4

@reggaeguitar由於'ConditionalAttribute'會導致編譯器忽略對函數的調用,但直接賦值不是調用,它實際上是委託構造,所以不能省略。 lambda可以工作,因爲它創建了一個匿名函數,它不做任何事情或者調用條件函數。無論哪種情況,代表都是明確的。 – Kyle

3

可以用戶這個替代的符號太:

MyPCL.PCLDebug.LogLine = delegate(string text) { System.Diagnostics.Debug.WriteLine(text); };