从C#传递枚举值到Java构造函数

时间:2013-01-10 18:17:40

标签: c# ikvm

我需要使用IKVM从C#运行JAR文件。 JAR包含一个类,其构造函数将枚举作为其参数之一。我面临的问题是,当我尝试使用IKVM在C#中创建此类的实例时,会抛出IllegalArgumentException。

Java enum:

public class EventType{
  public static final int General;
  public static final int Other;
  public static int wrap(int v);
}

Java类:

public class A{
   private EventType eType;
   public A(EventType e){
     eType = e;
   }
}

C#用法:

/* loader is the URLClassLoader for the JAR files */
java.lang.Class eArg = java.lang.Class.forName("A", true, loader);

/* Instantiate with the underlying value of EventType.General */
object obj = eArg.getConstructor(EventType).newInstance(0); 

eArg由forName(..)方法正确加载。但是,eArg类的实例化会抛出IllegalArgumentException。除了exception.TargetSite.CustomAttributes指定未实现该方法之外,异常中没有消息。我也尝试将构造函数参数作为java.lang.Field对象传递,但即使这样也会产生相同的异常。

有没有人对我可能做错了什么有任何建议?

2 个答案:

答案 0 :(得分:1)

您需要传递(盒装)枚举值,而不是传递0(基础值)。所以这应该有效:

/* loader is the URLClassLoader for the JAR files */
java.lang.Class eArg = java.lang.Class.forName("A", true, loader);

/* Instantiate with the underlying value of EventType.General */
object obj = eArg.getConstructor(EventType).newInstance(EventType.General);

答案 1 :(得分:0)

我不是百分百肯定但我相信问题是在.NET中,enum的默认底层类型是int但是在Java中你将EventType定义为一个类。 Java中的构造函数需要一个对象,但是从.NET开始,您试图传递等效的int