2017-08-30 2 views
3

ich versuche zu laufen IBM Watson Gespräch Service in Einheit und following here, code snippetIBM Watson Gespräch Dienstfehler: kann nicht von ‚Methodengruppe‘ auf ‚conversation.onMessage‘ konvertieren

private Conversation m_Conversation = new Conversation(); 
    private string m_WrokspaceID = "xyz"; 
    private string m_input = "help"; 


    // Use this for initialization 
    void Start() { 
     Debug.Log("user : " + m_input); 
     m_Conversation.Message(OnMessage, m_WrokspaceID, m_input); 
    } 

    void OnMessage(MessageResponse resp, string customData) { 
     foreach (Intent mi in resp.intents) 
     { 
      Debug.Log("intent : " + mi.intent + ", confidence :" + mi.confidence); 
     } 

     Debug.Log("response :" + resp.output.text); 
    } 

Aber ich erhalte diesen Fehler

cannot convert from 'method group' to 'conversation.onMessage' 

Was mache ich falsch? Das Code-Snippet bekomme ich von Watson offiziellen Github Repo.

Objekt als Antwort Rückkehr vorgeschlagen:

public delegate void OnMessage(object resp, string customData); 

Sie werden Ihre OnMessage Methode ändern müssen zu reflektieren: enter image description here

+0

Bei welcher Zeile tritt dieser Fehler auf? Ich denke 'm_Converstion.Message (OnMessage ...'? Was ist die Signatur von 'm_Conversation.Message'? Was erwartet es als erster Parameter anstelle dieser Methode? –

+0

@ RenéVogt ja die gleiche Zeile, erwartet es Objekt –

Antwort

3

Sie können die Antwort umwandeln als ein Wörterbuch und versuchen, den Wert von dort zu erhalten. Wenn Sie ein generisches Objekt anstelle eines statischen Datenmodells verwenden, können Sie die Antwort besser verarbeiten.

private void OnMessage(object resp, string customData) 
{ 
    Dictionary<string, object> respDict = resp as Dictionary<string, object>; 
    object intents; 
    respDict.TryGetValue("intents", out intents); 

    foreach(var intentObj in (intents as List<object>)) 
    { 
     Dictionary<string, object> intentDict = intentObj as Dictionary<string, object>; 

     object intentString; 
     intentDict.TryGetValue("intent", out intentString); 

     object confidenceString; 
     intentDict.TryGetValue("confidence", out confidenceString); 

     Log.Debug("ExampleConversation", "intent: {0} | confidence {1}", intentString.ToString(), confidenceString.ToString()); 
    } 
} 
+0

aktualisiert Obwohl ich diesen Fehler buti habe, werde ich diesen Code auch versuchen. Und bitte können Sie mir sagen, dass es der Zweck ist, Absicht oder Vertrauen zu protokollieren. Ich denke, dass nur die Antwort im Gespräch wichtig ist. Ich bin nicht in der Lage, den Zweck von Absicht und Vertrauen Log zu verstehen, sollten wir verwenden oder Log Repsonse, um die Antwort von der Chatbot zeigen –

+0

Die Absicht und das Vertrauen oben ist zu zeigen, wie Werte von verschiedenen Schlüsseln im Wörterbuch erhalten. Mit dem obigen Beispiel können Sie verschiedene Objekte in der 'MessageResponse' wie 'output', 'context',' alternate_intents', 'entities' und' input' erhalten. Der "Kontext" ist besonders wichtig, da Sie den Kontext an den nächsten "MessageRequest" übergeben, um die Konversation am Laufen zu halten. – taj

+0

Warum hat Github Code Repo im richtigen Code? Zusätzlich möchte ich wissen, warum meine Rede zu Textkonversation standardmäßig nicht funktioniert –

3

Nach line 32 im Quellcode von Conversation wurde die Delegierten geändert das:

void OnMessage(object resp, string customData) { 
    // ... 
} 
+0

aber Wenn ich es zum Objekt mache, kann ich die Eigenschaften der MessageResponse-Klasse nicht verwenden –

+0

Der übliche Ansatz in solchen Fällen (wie praktisch überall mit Event-Handlern) besteht darin, das 'Objekt' explizit auf 'MessageResponse' zu ​​werfen : //msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.onclick (v = vs.110) .aspx zum Beispiel – haim770

+0

Ja ich habe Antwortobjekt geworfen, aber es ist fehlgeschlagen InvalidCastException: Kann nicht von Quelltyp zu Zieltyp umwandeln –