当存在条件属性时创建委托

34

我有一个可移植类库,其中包含一个名为PCLDebug的类:

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

我想要做的是在外部项目中设置一次,然后能够在PCL中调用LogLine来将东西打印到VS输出窗口。以下是我的尝试:

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

问题在于编译器抱怨,因为System.Diagnostics.Debug.WriteLine有一个Debug条件属性:

无法创建具有“System.Diagnostics.Debug.WriteLine(string)”的委托,因为它具有条件属性

如果LogLine调用仅在调试环境中起作用,我其实可以接受。但是我该如何让编译器满意呢?

2个回答

58

你可以尝试将其包装在lambda函数中:

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

为什么这个代码可行,但是直接赋值就不行? - reggaeguitar
7
因为ConditionalAttribute会导致编译器省略对函数的调用,但直接赋值不是调用,实际上它是委托构造,所以不能被省略。使用lambda表达式可以工作,因为它创建了一个匿名函数,该函数要么不执行任何操作,要么调用条件函数。在任何情况下,委托都会被明确分配。 - Kyle

6
你也可以使用这种替代表示法:
    MyPCL.PCLDebug.LogLine = delegate(string text) { System.Diagnostics.Debug.WriteLine(text); };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接