Przekazanie parametru dynamicznego powoduje wywołanie wyjątku RuntimeBinderException podczas wywoływania metody z interfejsu dziedziczonego

Po pewnym refaktoryzacji wpadł w interesujący problem z uruchomieniem i przypiął się do następującej sytuacji.

Podczas przekazywania właściwości z obiektu dynamicznego do metody w interfejsie, który został odziedziczony z interfejsu nadrzędnego, spoiwo wykonawcze nie może znaleźć metody.

Oto test demonstrujący zarówno awarię, jak i sukces (podczas wywoływania metody bezpośrednio na typie interfejsu nadrzędnego)

<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 nie powiedzie się: Assert.AreEqual nie powiodło się. Oczekiwano: <(null)>. Rzeczywisty:. „Test.Utility.IInheritEcho” nie zawiera definicji „EchoString”

Test # 2 Sukcesy.

Moje pytanie brzmi: czy moje założenie, że pierwszy test powinien zostać zaliczony, jest poprawne, czy też istnieje jakiś podstawowy powód, że tak nie jest?

Wiem, że mogę rozwiązać ten problem, rzucając parametry, gdy je przekazuję, lub przypisując je do zmiennych przed ich przekazaniem. Jestem bardziej ciekawy, dlaczego dziedziczony interfejs powoduje awarię RuntimeBinder ...

questionAnswers(2)

yourAnswerToTheQuestion