2012-01-03 102 views
1

的接口問題我有一個看起來像一個接口:與包括IronRuby的

interface IMyInterface { 
    MyObject DoStuff(MyObject o); 
} 

我想寫在IronRuby中這個接口的實現,並返回對象以備後用。

但是,當我嘗試做一些像

var code = @" 
    class MyInterfaceImpl 
     include IMyInterface 

     def DoStuff(o) 
      # Do some stuff with o 
      return o 
     end 
    end 

    MyInterfaceImpl.new"; 

Ruby.CreateEngine().Execute<IMyInterface>(code); 

我得到一個錯誤,因爲它不能被轉換爲IMyInterface的。我做錯了,還是不可能做我想做的事情?

回答

1

在IronRuby中實現CLR接口並將其傳遞迴CLR是不可能的。在你的例子中'MyInterfaceImpl'是一個Ruby類,而不是'IMyInterface'的CLR實現。

我站在糾正,按照吉米Schementi的職位。

你可以使用,無論IronRuby的類型爲動態對象.NET代碼裏面:

 

    var engine = Ruby.CreateRuntime().GetEngine("rb"); 
    engine.Execute("/*your script goes here*/"); 

    dynamic rubyScope = engine.Runtime.Globals; 
    dynamic myImplInstance = [email protected](); 

    var input = //.. your parameter 
    var myResult = myImplInstance.DoStuff(input); 

+0

這是完全不正確。在IronRuby中實現接口是受支持的。 – 2012-02-17 04:00:10

4

你想要做什麼是可能的; IronRuby通過將接口混合到類中來支持實現接口。

運行你的例子中,我得到這個異常:

Unhandled Exception: System.MemberAccessException: uninitialized constant MyInte 
rfaceImpl::IMyInterface 

這並不意味着該對象不能被強制轉換爲IMyInterface,它只是意味着紅寶石引擎不知道什麼IMyInterface是。這是因爲您必須通過使用ScriptRuntime.LoadAssembly來告訴IronRuby需要查找什麼程序集IMyInterface。例如,要加載當前組件,則可以做到這一點:

ruby.Runtime.LoadAssembly(typeof(IMyInterface).Assembly); 

下面顯示可以通過在接口上調用方法調用從C#一個Ruby定義的方法:

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()); 
    } 
} 
+0

@Jimmy_Schementi感謝您的信息!當我嘗試類似的東西時,我得到了一個不同的異常 - 我在一個單獨的程序集中有一個接口'IDummy',並且我嘗試在IronRuby中'實現'它。我得到的例外是'不能將混凝土轉換成IIntf'。如果我在沒有投射的情況下創建IR以外的對象並檢查其類型,則IsAssignableFrom(typeof my interaface)將返回false。我在做什麼不同? – 2012-02-18 16:51:52

+0

沒有看到你在做什麼,我只能猜測。 – 2012-06-21 12:47:38