c# - 将 Lambda 函数传递给 Xamarin.Android 绑定(bind)库中的 Kotlin 的 C# 生成代码

标签 c# android kotlin xamarin xamarin.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);
这样做的正确方法是什么?

最佳答案

我正在使用这个类来适应 Function1由 Kotlin 绑定(bind)导出到 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) => {}));
附:ResponseType是您输入参数的类别responseErrorType是您输入参数的类别error .

关于c# - 将 Lambda 函数传递给 Xamarin.Android 绑定(bind)库中的 Kotlin 的 C# 生成代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64013415/

相关文章:

java - Android Youtube V3 简单 API 403 错误 : accessNotConfigured

c# - 使用 LINQ 创建一个 List<T> 其中 T : someClass<U>

c# - 执行两个 IEnumerable 集合的联合类型

Android:将 Javascript 注入(inject) onPageFinished 事件之外的 Webview

java - 如何将 List<ViewHolder> 转换为 JSON 并通过 POST 请求发送到服务器

java - 我无法应用 gradle 6.x 插件

java - Android:找不到 setTextTypeFace 字体资源

java - C# ServiceStack 和 Java 之间的日期时间格式

c# - 如何在特定时间执行循环

java - 将 java 转换为 kotlin