Mic*_*ett 13 c# lambda interface
在一些类方法中,A,我需要调用一个库方法B,它IProgress<Object>作为一个参数.
通常,我可以实现IProgress<Object>作为A所在的类的一部分,然后将"this"传递给方法B.或者我可能创建一个新类,其唯一目的是IProgress<Object>正确实现和处理它 - 然后在这种情况下我' d创建该类的实例并将其传递给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)
}
Run Code Online (Sandbox Code Playgroud)
当然,我知道为什么这不会按原样运行--B想要一个实现的对象,IProgress<Object>而是将它交给一个Action对象.
有没有办法实现我想要实现的目标?(IE有我的实现,如果IProgress<Object>出现在方法A中?
Ser*_*rvy 13
代表无法实现接口(直接).
我想到了两个不错的选择:
更改要调用的方法的定义,以获取委托类型而不是IProgress类型.(如果可能的话;这将是更好的选择)
创建一个实现所需接口的新类型,并将委托作为参数来实现该功能.
#2的例子,虽然依赖于接口,可能看起来像这样:
interface IProgress<T>
{
void doStuff(T param);
}
class LambdaProgress<T> : IProgress<T>
{
Action<T> action;
public LambdaProgress(Action<T> action)
{
this.action = action;
}
public void doStuff(T param)
{
action(param);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你就可以做类似的事情:
B(new LambdaProgress<Object>(obj => ...));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8935 次 |
| 最近记录: |