2013-03-08 7 views
5

Voglio chiamare un metodo di interfaccia esplicitamente implementato (BusinessObject2.InterfaceMethod) tramite reflection, ma quando provo a utilizzare il seguente codice, ottengo un System.MissingMethodException per la chiamata Type.InvokeMember. I metodi senza interfaccia funzionano bene. C'è un modo per fare questo? Grazie.Come utilizzare Type.InvokeMember per chiamare un metodo di interfaccia implementato in modo esplicito?

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; 
     } 
    } 
} 

Dettagli eccezione: "Metodo 'Example.BusinessObject2.InterfaceMethod' non trovato."

+2

'type' dovrebbe essere il tipo per l'interfaccia, quindi' instance' in InvokeMember dovrebbe essere un'istanza della classe. In questo momento sembra che 'type' sia per la tua classe, non per la tua interfaccia. – vcsjones

+0

@vcsjones tranne nella chiamata a 'CreateInstance', dove deve essere il tipo concreto, non l'interfaccia. Ma in pratica: sì, quello che hai detto –

+0

OK, CreateInstance usa già il tipo concreto, quindi non ci sono cambiamenti. Non sono sicuro di quale "istanza in InvokeMember dovrebbe essere un'istanza della classe". si intende. Per favore, puoi elaborare/fornire un codice di esempio? – Polyfun

risposta

3

Ciò è causato dal fatto che BusinessObject2 implementa esplicitamente IMyInterface. È necessario utilizzare il tipo di IMyInterface per ottenere l'accesso alle e successivamente richiamare il metodo:

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

Questo mi dà l'eccezione "Metodo 'Example.IMyInterface.InterfaceMethod' non trovato." – Polyfun

+1

Ho anche bisogno di aggiungere BindingFlags.Public perché la modifica funzioni. Grazie. – Polyfun

+0

@ShellShock Grazie, risposta aggiornata. –

Problemi correlati