微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Xamarin.Android绑定库中将Lambda函数传递给C#生成的Kotlin代码Android绑定库

如何解决在Xamarin.Android绑定库中将Lambda函数传递给C#生成的Kotlin代码Android绑定库

我一直试图在Xamarin项目中使用我的Android库(用Kotlin编写),但是我一直坚持将Lambda函数传递给C#生成的Kotlin代码

我正在尝试做这样的事情

client.DoSomething((response) => {},(error) => {});

但是我遇到了这个错误

CS1660: Cannot convert lambda expression to type 'IFunction1' because it is not a delegate type

这是我的库为此特定功能生成的C#代码

using Android.Runtime;
using Java.Interop;
using java.lang;
using Kotlin.Jvm.Functions;
using System;
[Register ("doSomething","(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V","")]
public unsafe void DoSomething (IFunction1 onSuccess,IFunction1 onFailure);

这样做的正确方法是什么?

解决方法

我使用这个类是为了将 Kotlin 绑定导出的 Function1 适配到 C# Lambda:

class Function1Impl<T> : Java.Lang.Object,IFunction1 where T : Java.Lang.Object
{
    private readonly Action<T> OnInvoked;

    public Function1Impl(Action<T> onInvoked)
    {
        this.OnInvoked = onInvoked;
    }

    public Java.Lang.Object Invoke(Java.Lang.Object objParameter)
    {
        try
        {
            T parameter = (T)objParameter;
            OnInvoked?.Invoke(parameter);
            return null;
        }
        catch (Exception ex)
        {
            // Exception handling,if needed
        }
    }
}

使用该类,您将能够执行以下操作:

client.DoSomething(new Function1Impl<ResponseType>((response) => {}),new Function1Impl<ErrorType>((error) => {}));

P.S.:ResponseType 是输入参数 response 的类,ErrorType 是输入参数 error 的类。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。