Die Übergabe eines dynamischen Parameters löst eine RuntimeBinderException aus, wenn die Methode über die geerbte Schnittstelle aufgerufen wird

Ist nach einigen Umgestaltungen auf ein interessantes Laufzeitproblem gestoßen und hat sich auf die folgende Situation beschränkt.

Wenn eine Eigenschaft von einem dynamischen Objekt an eine Methode in einer Schnittstelle übergeben wird, die von einer übergeordneten Schnittstelle geerbt wurde, kann der Laufzeitordner die Methode nicht finden.

Hier ist ein Test, der sowohl Fehler als auch Erfolg demonstriert (wenn die Methode direkt auf dem übergeordneten Schnittstellentyp aufgerufen wird).

<code>using System.Dynamic;
using Microsoft.CSharp.RuntimeBinder;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Test.Utility
{
    public interface IEcho
    {
        string EchoString(string input);
    }

    public interface IInheritEcho : IEcho
    { }

    public class EchoClass : IInheritEcho
    {
        public string EchoString(string input)
        {
            return input;
        }
    }

    [TestClass]
    public class RuntimeBinderTest
    {
        [TestMethod]
        public void RuntimeBinder_should_work_when_dynamic_parameters_are_passed_to_method_from_inherited_interface()
        {
            //Arrange
            dynamic dynObject = new ExpandoObject();
            dynObject.Foo = "Bar";
            IInheritEcho echomore = new EchoClass();

            string echo = null;
            string exceptionMessage = null;

            //Act
            try
            {
                echo = echomore.EchoString(dynObject.Foo);
            }
            catch (RuntimeBinderException e)
            {
                exceptionMessage = e.Message;
            }

            //Assert
            Assert.AreEqual(echo, dynObject.Foo, false, exceptionMessage);
        }

        [TestMethod]
        public void RuntimeBinder_should_work_when_dynamic_parameters_are_passed_to_method_from_noninherited_interface()
        {
            //Arrange
            dynamic dynObject = new ExpandoObject();
            dynObject.Foo = "Bar";
            IEcho echomore = new EchoClass();

            string echo = null;
            string exceptionMessage = null;

            //Act
            try
            {
                echo = echomore.EchoString(dynObject.Foo);
            }
            catch (RuntimeBinderException e)
            {
                exceptionMessage = e.Message;
            }

            //Assert
            Assert.AreEqual(echo, dynObject.Foo, false, exceptionMessage);
        }
    }
}
</code>

Test 1 schlägt fehl: Assert.AreEqual ist fehlgeschlagen. Erwartet: <(null)>. Tatsächlich:. 'Test.Utility.IInheritEcho' enthält keine Definition für 'EchoString'

Test Nr. 2 ist erfolgreich.

Meine Frage ist, ob meine Annahme, dass der 1. Test bestanden werden sollte, richtig ist oder ob es einen fundamentalen Grund im Rahmen gibt, der dies nicht tut?

Ich weiß, dass ich das Problem beheben kann, indem ich die Parameter beim Übergeben oder Zuweisen zu Variablen vor dem Übergeben umsetze. Ich bin eher neugierig, warum die geerbte Schnittstelle den RuntimeBinder zum Fehlschlagen bringt ...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage