目标C的协议代表等同于xamarin

时间:2017-03-11 15:20:28

标签: c# ios objective-c xamarin xamarin.ios

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

但是在Objective c中,可以使用Protocols轻松完成。

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

如果有任何其他替代方法可以在c#中进行AFAIK授权

使用代码段进行解释将是一个好主意

1 个答案:

答案 0 :(得分:4)

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

我们创建了一个接口,用于定义用户将实现的协议方法,以扩展另一个接受此协议的类的功能作为代表

协议

public interface IWorkerDelegate
{
    void PreformAdditionalWork();
}

接受协议的类:

在此示例中存储为弱引用,因此请保留对您指定的代理的强引用...

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