Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# xamarin中目标C等效物的方案代表_C#_Ios_Objective C_Xamarin_Xamarin.ios - Fatal编程技术网

C# xamarin中目标C等效物的方案代表

C# xamarin中目标C等效物的方案代表,c#,ios,objective-c,xamarin,xamarin.ios,C#,Ios,Objective C,Xamarin,Xamarin.ios,我想使用委托设计模式将一些任务分配给子对象,一旦完成,它必须让我知道,以便我可以相应地采取行动 但是在Objective c中,使用协议可以很容易地完成 我知道协议等价物是C#中的接口,但我找不到任何关于如何在C#中进行委托的示例,我知道我们必须将子对象声明为弱对象,否则将发生循环引用 如果有其他方法可以实现这一目标,那么在c#中,AFAIK授权是不可能的 用代码片段进行解释是个好主意注意:这里混合使用C#和Obj-C术语,ObjC用斜体表示(我希望…;-) 我们创建了一个接口,该接口定义了协议

我想使用委托设计模式将一些任务分配给子对象,一旦完成,它必须让我知道,以便我可以相应地采取行动

但是在Objective c中,使用协议可以很容易地完成

我知道协议等价物是C#中的接口,但我找不到任何关于如何在C#中进行委托的示例,我知道我们必须将子对象声明为弱对象,否则将发生循环引用

如果有其他方法可以实现这一目标,那么在c#中,AFAIK授权是不可能的

用代码片段进行解释是个好主意

注意:这里混合使用C#和Obj-C术语,ObjC用斜体表示(我希望…;-)

我们创建了一个接口,该接口定义了协议方法,用户将实现该方法来扩展另一个类的功能,该类将该协议作为委托接受:

议定书: 接受协议的类: 在本例中存储为弱引用,因此保留对指定的代理的强引用

public class Worker
{
    WeakReference<IWorkerDelegate> _workerDelegate;

    public IWorkerDelegate WorkerDelegate
    {
        get
        {
            IWorkerDelegate workerDelegate;
            return _workerDelegate.TryGetTarget(out workerDelegate) ? workerDelegate : null;
        }
        set
        {
            _workerDelegate = new WeakReference<IWorkerDelegate>(value);
        }
    }

    public async Task DoAlotOfWork()
    {
        // Do some work and continue with a delegate if assigned....
        await Task.Run(() =>
        {
            Console.WriteLine("Worker.DoAlotOfWork");
        })
        .ContinueWith((Task task) =>
        {
            if (_workerDelegate != null)
                WorkerDelegate?.PreformAdditionalWork();
        });
    }
}
委托使用模式: 输出: 注意:这里混合了C#和Obj-C术语,ObjC是斜体(我希望…;-)

我们创建了一个接口,该接口定义了协议方法,用户将实现该方法来扩展另一个类的功能,该类将该协议作为委托接受:

议定书: 接受协议的类: 在本例中存储为弱引用,因此保留对指定的代理的强引用

public class Worker
{
    WeakReference<IWorkerDelegate> _workerDelegate;

    public IWorkerDelegate WorkerDelegate
    {
        get
        {
            IWorkerDelegate workerDelegate;
            return _workerDelegate.TryGetTarget(out workerDelegate) ? workerDelegate : null;
        }
        set
        {
            _workerDelegate = new WeakReference<IWorkerDelegate>(value);
        }
    }

    public async Task DoAlotOfWork()
    {
        // Do some work and continue with a delegate if assigned....
        await Task.Run(() =>
        {
            Console.WriteLine("Worker.DoAlotOfWork");
        })
        .ContinueWith((Task task) =>
        {
            if (_workerDelegate != null)
                WorkerDelegate?.PreformAdditionalWork();
        });
    }
}
委托使用模式: 输出:
伟大的谢谢:)太好了!谢谢:)
public class AdditionalWorkerDelegate : IWorkerDelegate
{
    public void PreformAdditionalWork()
    {
        Console.WriteLine("IWorkerDelegate.PreformAdditionalWork");
    }
}
var worker = new Worker();
await worker.DoAlotOfWork();
worker.WorkerDelegate = new AdditionalWorkerDelegate();
await worker.DoAlotOfWork();
Worker.DoAlotOfWork
Worker.DoAlotOfWork
IWorkerDelegate.PreformAdditionalWork