То, что вы хотите сделать, возможно; IronRuby поддерживает реализацию интерфейсов, смешивая интерфейс в классе.
При выполнении вашего примера я получаю следующее исключение:
Unhandled Exception: System.MemberAccessException: uninitialized constant MyInte
rfaceImpl::IMyInterface
Это не означает, что объект не может быть приведен к IMyInterface
, это просто означает, что движок Ruby не знает, что такое IMyInterface
. Это потому, что вы должны указать IronRuby, в каких сборках искать IMyInterface
, используя ScriptRuntime.LoadAssembly
. Например, чтобы загрузить текущую сборку, вы можете сделать это:
ruby.Runtime.LoadAssembly(typeof(IMyInterface).Assembly);
Ниже показано, что вы можете вызывать метод, определенный в Ruby, из C #, вызывая методы на интерфейсе:
public class MyObject {
}
public interface IMyInterface {
MyObject DoStuff(MyObject o);
}
public static class Program {
public static void Main(string[] args) {
var code = @"
class MyInterfaceImpl
include IMyInterface
def DoStuff(o)
# Do some stuff with o
puts o
return o
end
end
MyInterfaceImpl.new";
var ruby = IronRuby.Ruby.CreateEngine();
ruby.Runtime.LoadAssembly(typeof(MyObject).Assembly);
var obj = ruby.Execute<IMyInterface>(code);
obj.DoStuff(new MyObject());
}
}