c#当需要接口时是否可以提供lambda?

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

代表无法实现接口(直接).

我想到了两个不错的选择:

  1. 更改要调用的方法的定义,以获取委托类型而不是IProgress类型.(如果可能的话;这将是更好的选择)

  2. 创建一个实现所需接口的新类型,并将委托作为参数来实现该功能.

#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)