2013-03-08 32 views
5

我想通過反射調用顯式實現的接口方法(BusinessObject2.InterfaceMethod),但是當我使用以下代碼嘗試此操作時,Type.InvokeMember調用中出現System.MissingMethodException。非界面方法工作正常。有沒有辦法做到這一點?謝謝。如何使用Type.InvokeMember來調用一個顯式實現的接口方法?

using System; 
using System.Reflection; 
using System.Runtime.InteropServices; 
using System.Text; 

namespace Example 
{ 
    public class BusinessObject1 
    { 
     public int ProcessInput(string input) 
     { 
      Type type = Assembly.GetExecutingAssembly().GetType("Example.BusinessObject2"); 
      object instance = Activator.CreateInstance(type); 
      instance = (IMyInterface)(instance); 
      if (instance == null) 
      { 
       throw new InvalidOperationException("Activator.CreateInstance returned null. "); 
      } 

      object[] methodData = null; 

      if (!string.IsNullOrEmpty(input)) 
      { 
       methodData = new object[1]; 
       methodData[0] = input; 
      } 

      int response = 
       (int)(
        type.InvokeMember(
         "InterfaceMethod", 
         BindingFlags.InvokeMethod | BindingFlags.Instance, 
         null, 
         instance, 
         methodData)); 

      return response; 
     } 
    } 

    public interface IMyInterface 
    { 
     int InterfaceMethod(string input); 
    } 

    public class BusinessObject2 : IMyInterface 
    { 
     int IMyInterface.InterfaceMethod(string input) 
     { 
      return 0; 
     } 
    } 
} 

異常詳細信息:「Method'Example.BusinessObject2.InterfaceMethod'not found。」

+2

'type'應類型的接口,那麼'instance'在InvokeMember應該是你的類的實例。現在看起來'type'是針對你的課程的,而不是你的接口。 – vcsjones 2013-03-08 14:24:00

+0

@vcsjones除了在調用CreateInstance之外,它需要是具體類型,而不是接口。但基本上:是的,你說什麼 – 2013-03-08 14:25:30

+0

OK,CreateInstance已經使用了具體類型,所以沒有改變。我不確定InvokeMember中的哪個實例應該是您班級的一個實例。「手段。請你能詳細說明/提供一些示例代碼嗎? – Polyfun 2013-03-08 14:36:06

回答

3

這是由BusinessObject2明確實施IMyInterface這一事實引起的。您需要使用IMyInterface類型來訪問,並隨後調用的方法:

int response = (int)(typeof(IMyInterface).InvokeMember(
        "InterfaceMethod", 
        BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, 
        null, 
        instance, 
        methodData)); 
+0

這給了我例外的「方法」Example.IMyInterface.InterfaceMethod'未找到。「 – Polyfun 2013-03-08 14:32:44

+1

我還需要爲您的更改添加BindingFlags.Public工作。謝謝。 – Polyfun 2013-03-08 14:39:08

+0

@ShellShock謝謝,回覆更新。 – 2013-03-08 16:17:25

相關問題