0

我正在评估 java 以从 java 调用 C# dll。正如我所看到的,它更符合我的上下文(jni4net 的通用失败,并且 JnBridge 不会导出我的所有类型)

我想在复杂的泛型上调用具有空实例的方法。

System.Func<MyType<MySubType>, MyOtherType, MyAnotherType>

我尝试在没有泛型的情况下调用,但 javonet 找不到该方法。

new NNull("System.Func")

我尝试使用 return 调用,但 javonet 再次找不到该方法。

new NNull("System.Func`3[MyType`1[MySubType],MyOtherType,MyAnotherType]")

我没有找到调用 NNull 的通用方法?有没有 ?

在此先感谢您的帮助;o)

4

1 回答 1

0

如果只有一种方法具有匹配数量的参数(没有重载),那么您可以轻松传递“null”。

但是,由于 Javonet invoke(String, Object...)方法需要方法名称和任意数量的参数,如果您想传递单个参数 null 您必须调用 obj.invoke("MethodName", new Object[] {null}); 所以 Java 知道你传递单个参数 null 而不是 null 数组,这意味着根本没有参数。

在您的.NET 方面:

public class ObjA
{
    public void MethodA(Func<MyType<MySubType>, MyOtherType, MyAnotherType>  arg)
    {
        Console.WriteLine("Called MethodA");
    }
}

public class MyType<T>
{

}
public class MySubType
{

}

public class MyOtherType
{

}

public class MyAnotherType
{

}

并使用 Java 调用它,您只需简单地:

    NObject objA = Javonet.New("ObjA");
    objA.invoke("MethodA",new Object[] {null});

只有当.NET 无法从传递的 null 中推断出应该调用哪个方法时,才需要具有匹配数量参数的另一个方法时才需要NNull 类型。例如:

public void MethodA(Func<String> arg1);
public void MethodA(Func<int> arg1);

有多个重载

另一方面,如果您有多个具有相同数量参数的方法重载,并且想要传递 null 而不是与纯 .NET 中相同的复杂参数,则必须将 null 转换为预期的类型:

public class ObjA
{
    public void MethodA(Func<MyType<MySubType>, MyOtherType, MyAnotherType> arg, int arg2)
    {
        Console.WriteLine("Called MethodA with args: Func<MyType<MySubType>, MyOtherType, MyAnotherType> arg, int arg2");
    }
    public void MethodA(Func<MyOtherType> arg, int arg2)
    {
        Console.WriteLine("Called MethodA with args: Func<MyOtherType> arg, int arg2");
    }
}

在 .NET 中,您会调用:

MethodA((Func<MyType<MySubType>, MyOtherType, MyAnotherType>)null, 0);

您仍然可以使用此处提供的 Java 1.4hf26-SNAPSHOT 版本在 Java 中完成相同的操作:http: //download.javonet.com/1.4/javonet-1.4hf26-SNAPSHOT.jar

它不是官方发布的,但它是稳定的,可以使用。该补丁包括将 NType 作为参数传递给 NNull 对象的可能性。在这种情况下,您将能够使用 Java 泛型类型创建语法构造复杂的泛型类型,如下例所示:

    NType myAnotherType = Javonet.getType("MyAnotherType");
    NType myOtherType = Javonet.getType("MyOtherType");
    NType mySubType = Javonet.getType("MySubType");
    NType myType = Javonet.getType("MyType`1",mySubType);
    NType func = Javonet.getType("Func`3",myType,myOtherType,myAnotherType);

    NObject objA = Javonet.New("ObjA");
    objA.invoke("MethodA",new NNull(func),0);
于 2016-09-29T14:38:21.747 回答