【发布时间】:2012-09-09 21:11:31
【问题描述】:
在某个类方法A中,我需要调用一个库方法B,它以IProgress<Object>为参数。
通常,我可以将IProgress<Object> 实现为A 所在类的一部分,然后将“this”传递给方法B。或者我可以创建一个新类,其唯一目的是实现IProgress<Object> 并处理它正确 - 然后在这种情况下,我将创建该类的一个实例并将其传递给 B。
但我真正想要的是让我的 IProgress<Object> 实现出现在我正在调用 B 的方法中,这样调用代码和 IProgress<Object> 实现之间的视觉断开就会减少. (我认为我的 IProgress 实现是调用方法的一种私有的、非共享的细节,因此我不希望我的 IProgress<Object> 实现在一个完全独立的方法中,可能是另一个类)。
我一直在尝试做的是使用一个 lambda,我将在其中定义我的短进度处理,然后以某种方式将此 lambda 传递给 B,如下所示:
method in class A {
...
Action<Object> Report = (m) => { // do something useful with m };
B(Report)
}
method B(IProgress<Object> reporter) {
reporter.Report(some object)
}
当然,我知道为什么这不能按原样工作 - B 想要一个实现 IProgress<Object> 的对象,而我将其交给了一个 Action 对象。
有什么方法可以实现我想要实现的目标吗? (如果 IProgress<Object> 出现在方法 A 中,IE 有我的实现吗?
【问题讨论】:
-
C# lambda 是匿名委托。您需要的是实现接口的匿名类型。有关 C# 提供的 only-public-properties 匿名类型的一些解决方法,请参阅 this question。