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